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


Answers:


295

您的问题是由于$i语句失败时具有空白值的事实引起的。 如果存在比较小的可能性,则总是在进行比较时引用变量,例如:

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

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

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

Shell执行该特定代码行时要做的第一件事就是替换的值$i,就像您最喜欢的编辑器的search&replace函数一样。因此,假设它$i是空的,或者甚至是说明性的,假设它$i是一堆空格!该外壳将替换$i如下:

if [     -ge 2 ] ; then ...

现在完成了变量替换,shell继续进行比较,并且...失败了,因为它看不到左侧的任何可理解的内容-gt。但是,引用$i

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

变成:

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

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

您还可以为$iif $i为空白指定默认值,如下所示:

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

这将替代值0,而不是$i$i不确定。我仍然保留引号,因为如果$i又是一堆空白,那么它就不会算作undefined,它不会被0代替,您将再次遇到问题。

如果您有时间,请阅读此内容。许多人都将shell视作黑盒子,但是它使用的规则却非常少且非常简单-一旦您知道了这些规则是什么(其中一个就是变量在shell中的工作方式,如上所述),shell便会没有更多秘密供您选择。


7
引用变量将上升像一个新的错误整数表达预期
内斯托尔

@Néstor 错误,如果变量为数字,则引用变量不会引发新的错误,如预期的整数表达式;提供非数字变量值(无论是否带引号)都将导致上述错误。
vladr

6

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


6

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

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

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

请参阅:ArithmeticExpression


2

您的脚本效果很好。您确定在if之前没有分配其他任何内容给“ i”吗?

一个常见的错误是在方括号前后都没有留出空格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.