Answers:
您的问题是由于$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
。
您还可以为$i
if $i
为空白指定默认值,如下所示:
if [ "${i:-0}" -ge 2 ] ; then ...
这将替代值0,而不是$i
被$i
不确定。我仍然保留引号,因为如果$i
又是一堆空白,那么它就不会算作undefined,它不会被0代替,您将再次遇到问题。
如果您有时间,请阅读此内容。许多人都将shell视作黑盒子,但是它使用的规则却非常少且非常简单-一旦您知道了这些规则是什么(其中一个就是变量在shell中的工作方式,如上所述),shell便会没有更多秘密供您选择。
我需要加5美分。我看到每个人都使用[
or [[
,但是值得一提的是它们不是if语法的一部分。
对于算术比较,请((...))
改用。
((...))是一种算术命令,如果表达式非零则返回退出状态,如果表达式非零则返回退出状态。如果需要副作用(赋值),也可以用作“ let”的同义词。