运行Shell脚本时if语句附近出现报错是什么原因?
报错核心诱因
- for循环语法结构完全错误:Shell for循环的固定结构是
for 遍历规则; do 循环逻辑; done,do是循环体起始关键字,必须紧跟循环遍历规则之后,原脚本把do错放在两个if判断块之后,直接导致语法解析失败。 [ ]判断格式违反语法规则:[是Shell内置的test命令,不是普通符号,命令后、比较运算符两侧、结尾的]前都必须加空格。原脚本中[$input、[$i==10]这类写法没有留空格,Shell会把[$input识别为不存在的命令,直接抛出command not found错误。- 比较运算符书写不规范:
- 整数判断不能直接连写
$i=5/$i==10:等号两侧不留空格时,Shell会把整段内容识别为字符串拼接或赋值操作,不会执行比较逻辑;且Shell原生test语法做整数比较推荐使用-eq操作符,兼容性更强。 - 字符串比较的
=两侧也必须留空格,原脚本中="Yes"的连写写法规避了比较运算符的识别,会触发参数数量错误。
- 整数判断不能直接连写
- 逻辑块配对错位:原脚本if/else/fi缩进混乱,嵌套if的else、fi没有和外层if正确配对,会触发语法解析错误。
- 变量未做边界防护:读入的
$input变量没有加双引号包裹,如果用户输入空内容或者带空格的内容,会触发判断参数缺失的报错。
修正方案
按照Shell语法规范调整关键字位置、补全必要空格、对齐逻辑块、给变量加引号防护即可,修正后的可运行代码如下:
for i in {1..10} do echo "Iteration no: $i" echo "Enter a number" read number echo "youve entered $number" if [ $i -eq 5 ] then echo "Youve completed 5 iterations, do you wish to continue?" read input if [ "$input" = "Yes" ] then continue else break fi fi if [ $i -eq 10 ] then break fi done
内容的提问来源于stack exchange,提问作者adithya vishwa
相关产品推荐
相关产品推荐

