下面的代码提供
[:-ge:一元运算符预期
什么时候
i=0
if [ $i -ge 2 ]
then
#some code
fi
为什么?
你的问题源于一个事实,即$i
有一个空值时,你的语句失败。在进行比较时,如果有丝毫的机会,他们中的一个可能是空的,e.g务必注明您的变量:
if [ "$i" -ge 2 ] ; then
...
fi
这是因为壳如何处理变量。假设原来的例子,
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
就是一堆空白的,然后它不会为未定义算,也不会以0代替,你会碰到问题再一次。
当你有时间请阅读this。外壳采用像对待许多一个黑盒子,但它很少而且很简单的规则下运行 - 一旦你知道什么那些规则(它们是变量在shell是如何工作的一个,如上所述)shell将对你没有更多的秘密。
从错误信息来看,i的值是空字符串,当你执行它,而不是0。
我需要加我5美分。我看到大家使用[
或[[
,但值得一提的是,他们都没有,如果语法的一部分。
对于算术比较,而是使用((...))
。
((...))是一个算术命令,如果表达式为非零返回为0的退出状态,或1,如果该表达式是零。也用作“let”的,如果需要的副作用(分配)的同义词。
你的一段脚本工作得很好。你确定你是不是分配,如果以“我”之前什么事吗?
一个常见的错误也没有后的方括号前留出空间。