Bash中if-then语法错误排查:统计每行单词数奇偶性失败
脚本错误修复与解释
你的脚本存在几处语法和逻辑错误,导致运行报错,以下是具体问题和修复方案:
错误点分析
- 变量赋值错误:
n= echo "$(echo $line | wc -w)"写法不符合bash赋值规则,变量赋值时=前后不能有空格,且正确的命令替换赋值格式应为n=$(command)。 - if条件语法问题:
if[ n % 2 == 0 ]; then存在多个问题:if与[之间必须加空格,[和表达式开头也需要空格- 引用变量必须加
$符号,即要用$n而非n - bash中数字比较需用
-eq(相等),==是字符串比较语法;算术判断推荐用(( ... ))写法更直观简洁
- 细节疏漏:
read line未加-r选项会导致反斜杠被意外转义;输入文件参数$1未用双引号包裹,文件名含空格时会失效;开头条件判断的大括号属于多余写法。
修复后的脚本
#!/bin/bash if [ $# -ne 1 ]; then echo "Wrong number of arguments!" exit 1 fi while read -r line; do # 统计当前行单词数,双引号包裹$line避免空格分割异常 n=$(echo "$line" | wc -w) # 双括号语法处理算术条件判断 if (( n % 2 == 0 )); then echo "Is even" else echo "Is odd" fi done < "$1"
额外优化说明
read -r line保留输入行中的反斜杠字符,避免不必要的转义echo "$line"用双引号包裹,确保含空格的行被正确识别,单词数统计更准确done < "$1"用双引号包裹文件名参数,适配带空格的文件名场景
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

