# prints "here" when run in bash
if [[ ((9 > 220)) ]]; then echo "here"; fi
我很困惑为什么上面的 if 语句被评估为 true。不会((9 > 220))
评估为假,这会使 if 语句为假吗?下面的代码按预期运行。我很困惑为什么在双括号“if”中使用双括号在上面不起作用。
# doesn't print anything
if ((9 > 220)); then echo "here"; fi
条件构造中的这两个复合命令之间存在根本区别。
[[ expression ]]
复合命令在您的第一个示例中,您正在使用以下[[ expression ]]
命令:
if [[ ((9 > 220)) ]]; then echo "here"; fi
其中括号仅仅视为分组运算符,用于覆盖其它运营商(比如正常优先级!
,&&
,||
,>
,-gt
,-e
,等等)。>
在这种情况下,运算符是字典大于。
这很好地描述在man bash
:
[[ expression ]]
根据条件表达式表达式的计算结果返回 0 或 1 状态。表达式由以下条件表达式中描述的主要元素组成。对[[和]]之间的词不进行分词和路径名扩展;执行波浪号扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。条件运算符(例如)
-f
必须不加引号才能被识别为主要运算符。与 一起使用时
[[
,<
和>
运算符使用当前语言环境按字典顺序排序。
因此,要在[[
复合命令中比较整数,您可以使用条件表达式运算符,与test
和[
命令使用的相同。例如像这样:
if [[ 9 -gt 220 ]]; then echo "here"; fi
结果与-gt
运算符用括号分组时相同:
if [[ ((9 -gt 220)) ]]; then echo "here"; fi
或者,您可以使用算术扩展并利用布尔结果表示为"0"
or的事实"1"
:
if [[ $((9 > 200)) == 1 ]]; then echo "here"; fi
(( expression ))
复合命令在您的第二个示例中,您正在使用以下(( expression ))
命令:
if ((9 > 220)); then echo "here"; fi
其中expression
是根据shell 算术规则计算的。该man bash
说:
((expression))
表达式根据以下算术求值中描述的规则进行求值。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于
let "expression"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句