Bash脚本读取文件三元组行比较score时算术语法错误排查
解决Bash脚本分数比较的算术语法错误问题
问题原因
报错的核心原因是目标文件使用了Windows风格的换行符(CRLF,即\r\n),导致读取的$score变量末尾带有隐藏的\r字符。比如实际读取到的不是90,而是90\r,Bash在解析[[ $score -gt 50 ]]时,会把\r当成语法的一部分,从而抛出"invalid arithmetic operator"错误。
可以用以下命令验证:
cat -v StudentThatCompletedtheExam.txt
如果每行末尾显示^M,就说明是换行符的问题。
解决方案(保留初学者易懂的写法)
方案1:先转换文件为Unix风格换行符
直接把目标文件的换行符改成Unix格式(\n),之后脚本就能正常运行:
# 转换文件换行符(需要安装dos2unix工具) dos2unix StudentThatCompletedtheExam.txt
如果没有dos2unix,也可以用sed命令:
sed -i 's/\r$//' StudentThatCompletedtheExam.txt
方案2:在脚本中处理score变量
不想修改原文件的话,在读取score后,用参数扩展去掉末尾的控制字符:
#!/bin/bash while read nom; do read pren read score # 去掉score末尾的所有控制字符(包括\r) score=${score%%[[:cntrl:]]} if [[ $score -gt 50 ]]; then echo $nom echo $pren echo $score fi done < "StudentThatCompletedtheExam.txt"
另外,原脚本里的nomFich="fichier.txt"和n=$(sort $nomFich | uniq | wc -l)完全没用到,可以直接删除,避免代码冗余。
内容的提问来源于stack exchange,提问作者Doom
相关产品推荐
相关产品推荐

