今天在写脚本的时候碰到一个这样的问题,为了研究一下我把原来的代码改成简单的,大体上没有变化,报错也一样,代码如下:
#!/bin/bashread -p "输入四个参数:" a b c dif [ -z ${a} -o -z ${b} -o -z ${c} -o -z ${d} ];thenecho -e "\033[1;4;31m"输入四个参数,如:18415 082801 18456 4"\033[0m"exit 4fiecho $a $b $c $d
我运行脚本会报如下图的错误:
Shell 脚本中的"[: too many arguments"错误与我这个错误时一样的,只是中英文区别
在网上查看下,Shell 脚本中的"[: too many arguments"错误跟我这个
如图,为了触发判断,我没有输入任何参数,直接看代码的话感觉逻辑也没有什么问题,但是为什么会报错呢?
后来经过几次调试测试,终于发现了原因:
先看调试过程,如下图:
可以看到红色方框内变量的值全为空值,这个空值没有范围,这时候它们之间的空格迷惑了bash,会让bash认为每一个变量都有多个空值,而每一个变量的值都是跟一个值-z做比较,所以会报上图的错误,参数太多
解决办法:
一:可以给每一个变量加上双引号,给变量的值界定范围,这样就可以保证变量的值只有一个,不会引起bash的误会
#!/bin/bashread -p "输入四个参数:" a b c dif [ -z "${a}" -o -z "${b}" -o -z "${c}" -o -z "${d}" ];thenecho -e "\033[1;4;31m"输入四个参数,如:18415 082801 18456 4"\033[0m"exit 4fiecho $a $b $c $d
再次运行脚本结果如下:
二:可以在每个变量的前面加上一个x,可以保证输入的字符串不为空那就是一个值,也不会引起bash的误会,这样也可以使我这个脚本不报错,但是这个办法在我这个脚本里面并不是很合适,因为这样会导致我的脚本输入的值没有空值,与本意相违背,代码如下:
#!/bin/bashread -p "输入四个参数:" a b c dif [ -z x${a} -o -z x${b} -o -z x${c} -o -z x${d} ];thenecho -e "\033[1;4;31m"输入四个参数,如:18415 082801 18456 4"\033[0m"exit 4fiecho $a $b $c $d
再次运行脚本结果如下:
这时候脚本输出的变量的值就是空值,不会再有之前的报错
大多数时候出现参数过多这种报错都可以尝试这两种办法,出现这样的报错也可能是[ ]和[[ ]]的使用导致,还有其他的原因,欢迎评论分享与指正我的理解,谢谢!