在bash比较整数,单目运算符预期

问题描述 投票:130回答:4

下面的代码提供

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

什么时候

i=0

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

为什么?

linux bash shell
4个回答
290
投票

你的问题源于一个事实,即$i有一个空值时,你的语句失败。在进行比较时,如果有丝毫的机会,他们中的一个可能是空的,e.g务必注明您的变量:

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

这是因为壳如何处理变量。假设原来的例子,

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

该执行的代码,尤其是线的时候,壳做的第一件事是替代$i的价值,就像你喜欢的编辑器的搜索和替换功能会。所以假设$i是空的,或者甚至更能说明问题,假设$i是一堆的空间!外壳将如下取代$i

if [     -ge 2 ] ; then ...

现在,变量替换完成后,与比较外壳收益和....失败,因为它看不到任何东西理解到-gt的左侧。然而,引用$i

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

变为:

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

外壳现在看到的双引号,并且知道你实际上是比较4个坯2,将跳过if

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

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

这将替代值0,而不是$i的是$i是不确定的。我仍然保持引号,因为再次,如果$i就是一堆空白的,然后它不会为未定义算,也不会以0代替,你会碰到问题再一次。

当你有时间请阅读this。外壳采用像对待许多一个黑盒子,但它很少而且很简单的规则下运行 - 一旦你知道什么那些规则(它们是变量在shell是如何工作的一个,如上所述)shell将对你没有更多的秘密。


6
投票

从错误信息来看,i的值是空字符串,当你执行它,而不是0。


6
投票

我需要加我5美分。我看到大家使用[[[,但值得一提的是,他们都没有,如果语法的一部分。

对于算术比较,而是使用((...))

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

请参阅:ArithmeticExpression


2
投票

你的一段脚本工作得很好。你确定你是不是分配,如果以“我”之前什么事吗?

一个常见的错误也没有后的方括号前留出空间。


推荐问答