Bash/Shell:if-else判断字符串长度输出错误是什么原因?
问题解答
脚本逻辑错误原因
脚本的核心错误出在条件判断的命令替换逻辑:
- 你在
if和elif的判断中,写的是$( "$FILENAME" | wc -c ),这里直接把变量$FILENAME的值当作系统命令执行,而非把它的内容传递给wc做统计。系统找不到和字符串内容同名的命令,命令执行无有效标准输出,所以$()拿到的结果是空值,数值比较时空值会被当作0处理,自然永远满足-lt 10的判断条件。 - 修正后的脚本需要补全
echo命令,把变量内容打印后传递给wc,正确写法如下:
#!/bin/sh FILENAME="thisislongerthantencharacters" echo $FILENAME # 加-n参数避免echo输出末尾自动加换行符,导致统计多1位 echo -n "$FILENAME" | wc -c if [ $( echo -n "$FILENAME" | wc -c ) -gt 10 ] then echo "FILENAME is longer than 10 characters for: $FILENAME." elif [ $( echo -n "$FILENAME" | wc -c ) -lt 10 ] then echo "FILENAME is less than 10 characters for: $FILENAME." else echo "FILENAME length is exactly 10 characters for: $FILENAME." fi
除此之外更高效的实现方式是直接用Shell原生的变量长度获取语法${#FILENAME},不需要调用外部wc命令,写法更简单性能也更好:
if [ ${#FILENAME} -gt 10 ]
wc -c统计结果偏差的原因
通常出现统计结果和实际字符数不符有两个常见原因:
- 换行符统计问题:默认
echo命令输出内容后会自动在末尾加一个换行符\n,wc -c会把这个换行符算作1个字符,导致统计结果比实际字符串长度多1,统计时给echo加-n参数取消末尾换行符输出即可避免该问题。 - 字节和字符的差异:
wc -c的实际作用是统计字节数而非字符数,如果你的字符串包含多字节字符(比如中文、全角符号、特殊Unicode字符),单个字符会占用多个字节,统计结果就会比实际字符数大。如果需要准确统计字符数,应该用wc -m参数。
内容的提问来源于stack exchange,提问作者Chris Chance
相关产品推荐
相关产品推荐

