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

下面的代码给出

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

什么时候

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

为什么?

你的问题是由于$i在语句失败时有一个空白的值。 在进行比较时,如果其中一个可能是空的,那么总是引用你的variables,例如:

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

这是因为shell如何处理variables。 假设最初的例子,

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

执行特定代码行时shell执行的第一件事就是replace$i的值,就像您最喜欢的编辑器的search和replacefunction一样。 所以假设$i是空的,或者更具说明性,假设$i是一堆空格! shell将取代$i ,如下所示:

 if [ -ge 2 ] ; then ... 

现在variablesreplace完成了,shell继续进行比较,并且因为它看不到-gt左侧可理解的任何东西而失败。 不过,引用$i

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

变为:

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

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

如果$i为空,您也可以select为$i指定默认值,如下所示:

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

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

有空的时候请阅读。 这个shell被许多人看成是一个黑盒子,但是它运行的规则非常less,而且非常简单 – 一旦你意识到这些规则是什么(其中之一就是shell中的variables是如何工作的,如上所述),shell将会对你没有更多的秘密。

从错误消息来看,当你执行它时,我的值是空string,而不是0。

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

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

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

请参阅: ArithmeticExpression

你的脚本的作品很好。 你确定你没有在“我”之前分配任何东西吗?

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