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

Fil*_*erg 135 linux bash shell

以下代码给出

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

什么时候

i=0

if [ $i -ge 2 ]
then
    #some code
fi
Run Code Online (Sandbox Code Playgroud)

为什么?

vla*_*adr 293

您的问题源于$i您的语句失败时具有空值的事实. 如果其中一个可能是空的,则总是在执行比较时引用您的变量,例如:

if [ "$i" -ge 2 ] ; then
  ...
fi
Run Code Online (Sandbox Code Playgroud)

这是因为shell如何处理变量.假设原始的例子,

if [ $i -ge 2 ] ; then ...
Run Code Online (Sandbox Code Playgroud)

shell执行特定代码行时所做的第一件事是替换值$i,就像你喜欢的编辑器的搜索和替换函数一样.所以假设它$i是空的,或者更具说明性,假设$i是一堆空格!shell将替换$i如下:

if [     -ge 2 ] ; then ...
Run Code Online (Sandbox Code Playgroud)

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

if [ "$i" -ge 2 ] ; then ...
Run Code Online (Sandbox Code Playgroud)

变为:

if [ "    " -ge 2 ] ; then ...
Run Code Online (Sandbox Code Playgroud)

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

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

if [ "${i:-0}" -ge 2 ] ; then ...
Run Code Online (Sandbox Code Playgroud)

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

请阅读当你有时间.shell被许多人视为一个黑盒子,但它只用很少很简单的规则操作 - 一旦你知道这些规则是什么(其中一个是变量如何在shell中工作,如上所述),shell将会对你没有更多的秘密.

  • 引用变量将会出现像**整数表达式预期的新错误** (6认同)

sta*_*lue 6

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


Rom*_*aza 6

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

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

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

请参阅:ArithmeticExpression


Fer*_*lez 2

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

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