比较bash中的整数,一元运算符预期
下面的代码给出
[:-ge:预期的一元运算符
什么时候
i=0 if [ $i -ge 2 ] then #some code fi
为什么?
你的问题是由于$i
在语句失败时有一个空白的值。 在进行比较时,如果其中一个可能是空的,那么总是引用你的variables,例如:
if [ "$i" -ge 2 ] ; then ... fi
这是因为shell如何处理variables。 假设最初的例子,
if [ $i -ge 2 ] ; then ...
执行特定代码行时shell执行的第一件事就是replace$i
的值,就像您最喜欢的编辑器的search和replacefunction一样。 所以假设$i
是空的,或者更具说明性,假设$i
是一堆空格! shell将取代$i
,如下所示:
if [ -ge 2 ] ; then ...
现在variablesreplace完成了,shell继续进行比较,并且因为它看不到-gt
的左侧可理解的任何东西而失败。 不过,引用$i
:
if [ "$i" -ge 2 ] ; then ...
变为:
if [ " " -ge 2 ] ; then ...
shell现在看到双引号,并且知道你实际上将四个空格比较为2,并且会跳过if
。
如果$i
为空,您也可以select为$i
指定默认值,如下所示:
if [ "${i:-0}" -ge 2 ] ; then ...
这将替代值0而不是$i
是$i
是未定义的。 我仍然保持报价,因为再次,如果$i
是一堆空白,那么它不算作未定义 ,它不会被replace为0,你会再次遇到问题。
有空的时候请阅读。 这个shell被许多人看成是一个黑盒子,但是它运行的规则非常less,而且非常简单 – 一旦你意识到这些规则是什么(其中之一就是shell中的variables是如何工作的,如上所述),shell将会对你没有更多的秘密。
从错误消息来看,当你执行它时,我的值是空string,而不是0。
我需要添加我的5美分。 我看到每个人都使用[
或[[
,但值得一提的是,他们不是语法的一部分。
对于算术比较,请使用((...))
。
((…))是一个算术命令,如果expression式为非零,则返回退出状态0;如果expression式为零,则返回1。 如果需要副作用(分配),也用作“let”的同义词。
请参阅: ArithmeticExpression
你的脚本的作品很好。 你确定你没有在“我”之前分配任何东西吗?
一个常见的错误也不是在方括号之后和之前留下空格。