下面的代码给出
[ :-ge: 一元操作符预期
什么时候
i=0 if [ $i -ge 2 ] then #some code fi
为什么?
你的剧本写得很好。您确定在 if 到“ i”之前没有分配任何其他内容吗?
一个常见的错误是在方括号之后和之前不留空格。
从错误消息判断,执行时 i 的值是空字符串,而不是0。
您的问题产生于这样一个事实,即当您的语句失败时,$i有一个空值。在进行比较时,如果其中一个变量有一点点可能是空的,那么你的变量是:
$i
if [ "$i" -ge 2 ] ; then ... fi
这是因为 shell 处理变量的方式,
if [ $i -ge 2 ] ; then ...
Shell 在执行特定代码行时要做的第一件事就是替换 $i的值,就像您最喜欢的编辑器的 搜寻及替换函数那样。因此,假设 $i是空的,或者,更具说明性的是,假设 $i是一堆空格!该外壳将取代 $i如下:
if [ -ge 2 ] ; then ...
现在已经完成了变量替换,shell 继续进行比较和..。失败是因为它看不到 -gt的 左边能理解的东西。然而,引用 $i的话:
-gt
if [ "$i" -ge 2 ] ; then ...
变成:
if [ " " -ge 2 ] ; then ...
Shell 现在看到了双引号,并且知道您实际上是在将4个空格与2进行比较,因此将跳过 if。
if
如果 $i为空,还可以指定 $i的默认值,如下所示:
if [ "${i:-0}" -ge 2 ] ; then ...
这将替换值0,而不是 $i是 $i是未定义的。我仍然保留引号,因为,再一次,如果 $i是一堆空格,那么它不算作 未定义,它不会被替换为0,你会再次遇到问题。
有时间请看 这个。Shell 被很多人视为一个黑盒子,但是它运行的规则非常少而且非常简单——一旦你意识到这些规则是什么(其中之一就是变量在 shell 中是如何工作的,如上所述) ,shell 就不会再有什么秘密了。
我要加上我的5分钱。我看到每个人都使用 [或 [[,但值得一提的是,它们不是 if 语法的一部分。
[
[[
对于算术比较,使用 ((...))代替。
((...))
((...)是一个算术命令,如果 表达式为非零,如果表达式为零则为1 作为“ let”的同义词,如果需要副作用(作业)。 见: 算术表达式
((...)是一个算术命令,如果 表达式为非零,如果表达式为零则为1 作为“ let”的同义词,如果需要副作用(作业)。
见: 算术表达式