Bash脚本算术运算报错:invalid arithmetic operator问题求助
Bash脚本人口差值计算语法错误排查
问题场景
编写Bash脚本实现以下功能:传入参数diff时,从worldcities.csv文件提取两个指定城市的人口数据并计算差值,但执行时触发语法错误。
脚本代码
elif [[ $1 = "diff" ]] then if [[ $2 ]] && [[ $3 ]] then city1=$2 city2=$3 file="worldcities.csv" pop1=$(awk -F, -v city="$city1" '$1 == city {print $8}' "$file") pop2=$(awk -F, -v city="$city2" '$1 == city {print $8}' "$file") echo "pop of $city1, $pop1" echo "pop of $city2, $pop2" diff=$((pop1 - pop2)) echo "$diff" else exit 4 fi
预期输出
pop of New York, 18972871 pop of Montreal, 3519595 15453276
实际报错
pop of New York, 18972871 pop of Montreal, 3519595 ")syntax error: invalid arithmetic operator (error token is "
问题原因
报错本质是pop1或pop2变量包含非数字字符——大概率是CSV文件采用Windows格式,每行末尾带有回车符\r。awk提取人口数据时将\r一并带出,导致Bash执行算术运算$((pop1 - pop2))时,无法识别包含\r的字符串为有效数字,从而触发语法错误。
修复方案
方案1:提取数据时直接清理控制字符
修改awk命令,在输出人口数据前清除字段中的回车、换行符:
pop1=$(awk -F, -v city="$city1" '$1 == city {gsub(/[\r\n]/,"",$8); print $8}' "$file") pop2=$(awk -F, -v city="$city2" '$1 == city {gsub(/[\r\n]/,"",$8); print $8}' "$file")
方案2:提取后用Bash变量替换清理
在获取pop1和pop2后,添加变量替换语句去除回车符:
pop1=${pop1//$'\r'/} pop2=${pop2//$'\r'/}
将这两行插入到echo "pop of $city1, $pop1"之前即可。
方案3:转换CSV文件格式为Unix格式
如果CSV文件是Windows格式,直接转换为Unix格式从根源解决问题:
dos2unix worldcities.csv
内容的提问来源于stack exchange,提问作者user23573718
相关产品推荐
相关产品推荐

