Bash中如何不借助变量,用#运算符获取字符串字面量长度?
Bash字符串字面量长度计算问题解答
关于${#}相关语法的名称
你提到的${#parameter}中的#属于**参数扩展(Parameter Expansion)**语法的一部分,并非单独的"特殊参数"——特殊参数指的是$0、$*、$@这类预定义的系统参数,而#是参数扩展里专门用于计算参数值长度的操作符。
无需变量的字符串长度计算方法
Bash确实不支持直接在${#}中传入字符串字面量,但可以通过以下几种方式实现无变量计算:
1. 结合wc与here-string
利用wc -c统计字符数,注意减去here-string自动添加的换行符:
length=$(wc -c <<< ":/path/to/a/directory") length=$((length - 1)) # 最终结果为21
2. 使用printf配合wc
通过printf输出字符串,再用wc -c统计:
length=$(printf "%s" ":/path/to/a/directory" | wc -c)
3. 临时修改位置参数
利用位置参数作为临时载体,计算后可恢复原参数:
# 保存原位置参数 original_args=("$@") # 设置临时位置参数 set -- ":/path/to/a/directory" # 获取长度 length=${#1} # 恢复原位置参数 set -- "${original_args[@]}"
4. 借助awk的length函数
直接通过awk内置函数计算:
length=$(awk 'BEGIN{print length(":/path/to/a/directory")}')
直接使用字面量报错的原因
Bash的${#parameter}语法要求parameter必须是有效的参数(变量、位置参数、特殊参数等),字符串字面量不属于参数范畴,因此会触发"bad substitution"错误。而${#/path/to/a/directory}会被Bash解析为空命令替换,最终返回长度0。
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

