以下代码出现了“[: -ge: unary operator expected”错误提示,可能是因为:
i=0
if [ $i -ge 2 ]
then
#some code
fi
为什么?你的问题源于当语句失败时,$i
的值为空。如果有可能其中任意一个变量为空,请始终在执行比较时用引号括起来,例如:
if [ "$i" -ge 2 ] ; then
...
fi
这是因为shell对变量的处理方式不同。假设原始示例为:
if [ $i -ge 2 ] ; then ...
当 shell 执行该行代码时,第一件事是替换 $i
的值,就像你最喜欢的编辑器的搜索和替换功能一样。因此,假设 $i
为空或者更形象地说,假设 $i
是一堆空格!那么,shell 将按照以下方式替换 $i
:
if [ -ge 2 ] ; then ...
现在变量替换已经完成,Shell继续进行比较,并且失败了,因为它看不到-gt
左边的任何可理解的内容。但是,引用$i
:
if [ "$i" -ge 2 ] ; then ...
变为:
if [ " " -ge 2 ] ; then ...
使用双引号包裹字符串的时候,shell会识别到这是一个字符串,并且知道你是在将四个空格与数字2进行比较,所以会跳过if
语句。
如果需要在$i
为空时指定默认值,可以按照以下方式进行:
if [ "${i:-0}" -ge 2 ] ; then ...
这将用值0替换$i
,如果$i
未定义,则仍保留引号。 我仍然保留引号,因为如果$i
是一堆空格,则不算作未定义,它将不会被替换为0,您将再次遇到问题。[
或[[
,但值得一提的是它们不属于if语法的一部分。((...))
。
((...))
是一条算术命令,如果表达式为非零,则返回退出状态为0,如果表达式为零,则返回退出状态为1。如果需要副作用(赋值),也用作“let”的同义词。参见:算术表达式