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 ]]  再加一对 []

上一篇:安装开发环境vs2017+sql2016+tfs2017


下一篇:C语言是开源的吗?cC语言、C++是两个开源的标准,而不是开源软件或其它