107
A
回答
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将会没有更多的秘密给你。
6
我需要添加我的5美分。我看到每个人都使用[
或[[
,但值得一提的是,他们不是语法的一部分。
对于算术比较,请改为使用((...))
。
((...))是一个算术命令,该命令将返回0退出状态如果 表达式为非零,或1,如果该表达式是零。如果需要副作用(分配),也使用 作为“let”的同义词。
引用变量将上升一个新的错误,如预期**整数表达式** – 2016-02-17 01:49:55