shell 脚本 【: -ge/-le/=/... : unary operator expected (standard_in) 1: syntax error 报错教程
在写脚本的时候出现了语法错误,但运行结果正确。
脚本中报错的行为:
for (( i=0; i<=$line1; i=i+1 ))
do
if [ $(echo "${R12S[i]} < 3" |bc) -eq 1 ] && [ $(echo "${R23S[i]} > 3"|bc) -eq 1 ]\
&& [ $(echo "${R13S[i]} > 3"|bc) -eq 1 ]; then
P1=P1+1
elif [ $(echo "${R12S[i]} > 3" |bc) -eq 1 ] && [ $(echo "${R23S[i]} > 3" |bc) -eq 1 ]\
&& [ $(echo "${R13S[i]} < 3"|bc) -eq 1 ]; then
P2=P2+1
elif [ $(echo "${R12S[i]} > 3" |bc) -eq 1 ] && [ $(echo "${R23S[i]} < 3" |bc) -eq 1 ]\
&& [ $(echo "${R13S[i]} > 3" |bc) -eq 1 ]; then
P3=P3+1
elif [ $(echo "${R12S[i]} > 3" |bc) -eq 1 ] && [ $(echo "${R23S[i]} > 3" |bc) -eq 1 ]\
&& [ $(echo "${R13S[i]} > 3" |bc) -eq 1 ]; then
P4=P4+1
fi
done
报错如下:
(standard\_in) 1: syntax error
path.sh: line 84: [: -eq: unary operator expected
(standard\_in) 1: syntax error
path.sh: line 87: [: -eq: unary operator expected
(standard\_in) 1: syntax error
path.sh: line 90: [: -eq: unary operator expected
(standard\_in) 1: syntax error
path.sh: line 93: [: -eq: unary operator expected
用sh -c path.sh命令查询脚本内的语法 是否有错误
然而并无错误,说明脚本本身是没有问题的,问题应该出在运行的时候
百度了一下报错 [: -eq: unary operator expected 的原因,有网友说是因为if后的条件要加双重[ ],即[[ ]]。
于是把所有的条件语句作了修改,但依然报错
(standard\_in) 1: syntax error
(standard\_in) 1: syntax error
(standard\_in) 1: syntax error
(standard\_in) 1: syntax error
后面才发现是循环的问题
for (( i=0; i<=$line1; i=i+1 ))这一个循环是从0开始,到$line1结束,相当于循环了$line1+1次,
然而数组中总共只有$line1个数,故缺失了一个数,所以会出现错误,这也印证了为什么运行结果是正确的,因为最后一个数为空不会对前面的数造成影响。
修改:将for (( i=0; i<=$line1; i=i+1 ))改为for (( i=0; i<=$line1-1; i=i+1 )),再次运行便无报错信息。
再查了一下资料发现有很多人都遇到果这种类型的报错:
[: -ge/-le/=/... : unary operator expected 错误
====================================================================================================================
错误原因:
由于变量rate初始化赋值为空,那么就成了 [ -ge "10"] 了,显然 [ 和 "10" 不相比较并且缺少了 [ 符号,所以报了这样的错误。
解决办法:
1、检查是否因为赋值语句写错而导致赋值为空
2、赋值前加declare -i rate=0
3、改成 if [[ $rate -ge 10 ]] 再加一对 []