比较 bash 中的整数和一元运算符

下面的代码给出

[ :-ge: 一元操作符预期

什么时候

i=0


if [ $i -ge 2 ]
then
#some code
fi

为什么?

251716 次浏览

你的剧本写得很好。您确定在 if 到“ i”之前没有分配任何其他内容吗?

一个常见的错误是在方括号之后和之前不留空格。

从错误消息判断,执行时 i 的值是空字符串,而不是0。

您的问题产生于这样一个事实,即当您的语句失败时,$i有一个空值。在进行比较时,如果其中一个变量有一点点可能是空的,那么你的变量是:

if [ "$i" -ge 2 ] ; then
...
fi

这是因为 shell 处理变量的方式,

if [ $i -ge 2 ] ; then ...

Shell 在执行特定代码行时要做的第一件事就是替换 $i的值,就像您最喜欢的编辑器的 搜寻及替换函数那样。因此,假设 $i是空的,或者,更具说明性的是,假设 $i是一堆空格!该外壳将取代 $i如下:

if [     -ge 2 ] ; then ...

现在已经完成了变量替换,shell 继续进行比较和..。失败是因为它看不到 -gt左边能理解的东西。然而,引用 $i的话:

if [ "$i" -ge 2 ] ; then ...

变成:

if [ "    " -ge 2 ] ; then ...

Shell 现在看到了双引号,并且知道您实际上是在将4个空格与2进行比较,因此将跳过 if

如果 $i为空,还可以指定 $i的默认值,如下所示:

if [ "${i:-0}" -ge 2 ] ; then ...

这将替换值0,而不是 $i$i是未定义的。我仍然保留引号,因为,再一次,如果 $i是一堆空格,那么它不算作 未定义,它不会被替换为0,你会再次遇到问题。

有时间请看 这个。Shell 被很多人视为一个黑盒子,但是它运行的规则非常少而且非常简单——一旦你意识到这些规则是什么(其中之一就是变量在 shell 中是如何工作的,如上所述) ,shell 就不会再有什么秘密了。

我要加上我的5分钱。我看到每个人都使用 [[[,但值得一提的是,它们不是 if 语法的一部分。

对于算术比较,使用 ((...))代替。

((...)是一个算术命令,如果 表达式为非零,如果表达式为零则为1 作为“ let”的同义词,如果需要副作用(作业)。

见: 算术表达式