在bash中比较整数,一元运算符是预期的

时间:2009-01-03 12:18:34

标签: linux bash shell

以下代码给出了

  

[:-ge:一元运算符预期

何时

i=0

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

为什么?

4 个答案:

答案 0 :(得分:282)

您的问题源于$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 left 可理解的任何内容。但是,请引用$i

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

变为:

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

shell现在看到双引号,并且知道您实际上将四个空格比较为2并且将跳过if

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

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

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

请在有空的时候阅读this。 shell被许多人视为一个黑盒子,但它只用很少很简单的规则操作 - 一旦你知道这些规则是什么(其中一个是变量如何在shell中工作,如上所述),shell将会对你没有更多的秘密。

答案 1 :(得分:6)

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

答案 2 :(得分:6)

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

对于算术比较,请改用((...))

  

((...))是一个算术命令,如果返回退出状态0   表达式非零,如果表达式为零,则为1。也用过   作为“let”的同义词,如果需要副作用(赋值)。

     

请参阅:ArithmeticExpression

答案 3 :(得分:2)

你的脚本非常棒。你确定你没有在if到“i”之前分配任何其他内容吗?

常见的错误也不是在方括号之前和之前留下空格。