为什么这个 if 语句在 bash 中被评估为 true?

丹尼尔
# 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这个 if 语句总是返回 true?

来自分类Dev

为什么这个Smarty if语句总是评估为真?

来自分类Dev

为什么这个bash习语需要评估?

来自分类Dev

为什么“” <{}评估为true?

来自分类Dev

为什么(true && {})评估为{},而({} && true)评估为true?

来自分类Dev

为什么这个简单的bash regex不返回true?

来自分类Dev

为什么表达式a ==-if语句中为true?

来自分类Dev

为什么表达式a ==-if语句中为true?

来自分类Dev

Bash:“ if”语句始终将第一个条件评估为“ true”,即使为“ false”也是如此

来自分类Dev

当 {a statement that is equal to True} == True 评估为 false 时,为什么 True == True 评估为 True?

来自分类Dev

当我的变量不大于某个特定数字时,为什么我的if语句评估为true?

来自分类Dev

为什么if语句返回`true`?

来自分类Dev

为什么`false && true || true`评估为true?

来自分类Dev

为什么mysql评估(TRUE或TRUE和FALSE)为true?

来自分类Dev

为什么NotImplemented评估为True?

来自分类Dev

为什么{} == false评估为false,而[] == false评估为true?

来自分类Dev

Bash -eq评估为true吗?

来自分类Dev

为什么`[] == false`是true,而只是`[]`评估为true?

来自分类Dev

为什么(不是None)== True评估为True?

来自分类Dev

为什么“ [] == true”和“![] == true”都评估为false?

来自分类Dev

为什么 (true || false && false) 评估为 true?

来自分类Dev

为什么即使if if返回false,SQL也会在if exist构造的true部分中评估语句?

来自分类Dev

为什么我的elif在我的bash脚本中被视为else语句?

来自分类Dev

在if语句中时,cin如何评估为true?

来自分类Dev

为什么 Bash 变量在 if 语句内为空,而在 if 语句外不为空?

来自分类Dev

为什么此if语句总是返回true

来自分类Dev

为什么此if语句总是返回true

来自分类Dev

Greasemonkey:为什么if语句总是返回true?

来自分类Dev

为什么我在Python中的if语句评估为False?

Related 相关文章

  1. 1

    为什么这个 if 语句总是返回 true?

  2. 2

    为什么这个Smarty if语句总是评估为真?

  3. 3

    为什么这个bash习语需要评估?

  4. 4

    为什么“” <{}评估为true?

  5. 5

    为什么(true && {})评估为{},而({} && true)评估为true?

  6. 6

    为什么这个简单的bash regex不返回true?

  7. 7

    为什么表达式a ==-if语句中为true?

  8. 8

    为什么表达式a ==-if语句中为true?

  9. 9

    Bash:“ if”语句始终将第一个条件评估为“ true”,即使为“ false”也是如此

  10. 10

    当 {a statement that is equal to True} == True 评估为 false 时,为什么 True == True 评估为 True?

  11. 11

    当我的变量不大于某个特定数字时,为什么我的if语句评估为true?

  12. 12

    为什么if语句返回`true`?

  13. 13

    为什么`false && true || true`评估为true?

  14. 14

    为什么mysql评估(TRUE或TRUE和FALSE)为true?

  15. 15

    为什么NotImplemented评估为True?

  16. 16

    为什么{} == false评估为false,而[] == false评估为true?

  17. 17

    Bash -eq评估为true吗?

  18. 18

    为什么`[] == false`是true,而只是`[]`评估为true?

  19. 19

    为什么(不是None)== True评估为True?

  20. 20

    为什么“ [] == true”和“![] == true”都评估为false?

  21. 21

    为什么 (true || false && false) 评估为 true?

  22. 22

    为什么即使if if返回false,SQL也会在if exist构造的true部分中评估语句?

  23. 23

    为什么我的elif在我的bash脚本中被视为else语句?

  24. 24

    在if语句中时,cin如何评估为true?

  25. 25

    为什么 Bash 变量在 if 语句内为空,而在 if 语句外不为空?

  26. 26

    为什么此if语句总是返回true

  27. 27

    为什么此if语句总是返回true

  28. 28

    Greasemonkey:为什么if语句总是返回true?

  29. 29

    为什么我在Python中的if语句评估为False?

热门标签

归档