在bash中比较整数,需要使用一元运算符。

137
以下代码出现了“[: -ge: unary operator expected”错误提示,可能是因为:
i=0

if [ $i -ge 2 ]
then
    #some code
fi
为什么?
4个回答

295

你的问题源于当语句失败时,$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左边的任何可理解的内容。但是,引用$i

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

变为:

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

使用双引号包裹字符串的时候,shell会识别到这是一个字符串,并且知道你是在将四个空格与数字2进行比较,所以会跳过if语句。

如果需要在$i为空时指定默认值,可以按照以下方式进行:

if [ "${i:-0}" -ge 2 ] ; then ...
这将用值0替换$i,如果$i未定义,则仍保留引号。 我仍然保留引号,因为如果$i是一堆空格,则不算作未定义,它将不会被替换为0,您将再次遇到问题。
请在有时间的时候阅读这篇文章。很多人认为shell就像一个黑匣子,但它只遵循非常少而非常简单的规则 - 一旦您了解了这些规则(其中之一就是变量在shell中的工作方式,如上所述),shell对您来说就不再是秘密了。

7
引用变量会导致一个新的错误,如 需要整数表达式 - Néstor
@Néstor 错误,引用变量不会像需要整数表达式那样引发新的错误,如果变量是数字的话;提供非数字变量值,无论是否带引号,都将导致该错误。 - vladr

6
从错误信息来看,在执行时变量i的值为一个空字符串,而不是0。

6
我需要添上我的五分之一。我看到每个人都使用[[[,但值得一提的是它们不属于if语法的一部分。
对于算术比较,请改用((...))

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

参见:算术表达式


2
你的脚本非常好用。你确定在 if 语句之前没有给 "i" 赋其他值吗?
另一个常见错误是在方括号前后没有留空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接