2009-01-03 65 views

回答

1

你的一段脚本工作得很好。你确定你在“我”之前没有分配任何其他东西吗?

一个常见的错误是也没有在方括号之后和之前留下空格。

6

从错误信息来看,i的值是空字符串,当你执行它,而不是0

242

你的问题的事实,$i有一个空值时,你的语句失败出现。 进行比较时,如果有丝毫的机会,他们中的一个可能是空的,例如:

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

这是因为怎样的shell对变量总是给你变量。假设原来的例子,

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

的第一件事是,执行的代码,尤其是线的时候,外壳的作用是替代的$i的价值,就像你喜欢的编辑器的搜索&替换功能会。因此,假设$i为空,或者更具说明性,假设$i是一堆空格!外壳将如下取代$i

if [  -ge 2 ] ; then ... 

现在,变量替换完成后,与比较外壳收益和....因为它无法看到任何东西,使这个留下-gt失败。然而,引用$i

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

变为:

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

外壳现在看到的双引号,并且知道你实际上是比较4个坯2,将跳过if

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

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

这将替代值0,而不是$i$i是不确定的。我仍然保留报价,因为再次,如果$i是一堆空白,那么它不会被计为undefined,它不会被替换为0,并且您将再次遇到问题。

请您在有空的时候阅读this。shell被许多人视为黑盒子,但它的操作规则非常少且非常简单 - 一旦你意识到这些规则是什么(其中一个是变量如何在shell中工作,如上所述),shell将会没有更多的秘密给你。

+4

引用变量将上升一个新的错误,如预期**整数表达式** – 2016-02-17 01:49:55

6

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

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

((...))是一个算术命令,该命令将返回0退出状态如果 表达式为非零,或1,如果该表达式是零。如果需要副作用(分配),也使用 作为“let”的同义词。

参见:ArithmeticExpression