首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >bash中的比较整数,应为一元运算符

bash中的比较整数,应为一元运算符
EN

Stack Overflow用户
提问于 2009-01-03 12:18:34
回答 4查看 251.3K关注 0票数 138

下面的代码给出了

[:-ge:需要一元运算符

什么时候

代码语言:javascript
复制
i=0

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

为什么?

EN

回答 4

Stack Overflow用户

发布于 2009-03-03 04:41:42

您的问题源于这样一个事实:当您的语句失败时,$i的值为空值。在执行比较时始终引用变量,如果其中一个变量为空的可能性很小,例如:

代码语言:javascript
复制
if [ "$i" -ge 2 ] ; then
  ...
fi

这是因为shell处理变量的方式。假设最初的例子,

代码语言:javascript
复制
if [ $i -ge 2 ] ; then ...

执行特定代码行时,shell首先要做的就是替换$i的值,就像您喜欢的编辑器的搜索和替换函数一样。因此,假设$i是空的,或者更具说明性的是,假设$i是一堆空格!shell将替换$i,如下所示:

代码语言:javascript
复制
if [     -ge 2 ] ; then ...

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

代码语言:javascript
复制
if [ "$i" -ge 2 ] ; then ...

变成:

代码语言:javascript
复制
if [ "    " -ge 2 ] ; then ...

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

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

代码语言:javascript
复制
if [ "${i:-0}" -ge 2 ] ; then ...

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

如果你有时间,请阅读this。shell被许多人视为黑匣子,但它的操作规则非常少且非常简单-一旦您知道了这些规则是什么(其中一个规则是变量在shell中的工作方式,如上所述),shell就不会为您提供更多的秘密。

票数 295
EN

Stack Overflow用户

发布于 2009-01-03 12:31:02

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

票数 6
EN

Stack Overflow用户

发布于 2013-01-04 17:47:40

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

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

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

请参阅:ArithmeticExpression

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/408975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档