【问题标题】:bash while loop comparison not evaluatingbash while循环比较未评估
【发布时间】:2015-03-04 00:08:36
【问题描述】:

我试图了解 bash 中 ifwhile 语句的编码之间的区别。 在下面的脚本中,如果我使用IF,我会使用==-eq 等获得预期的结果。但是,对于所有测试,每个while 的while 循环似乎都评估为true。虽然循环 1 和 3 应该失败,对吗?

A != B, 
A == B,
A == C

我尝试过[ "" "" ][[ "" "" ]] 等的不同组合。

while 的正确语法是什么

谢谢 艺术

#!/bin/sh
set -x
myVarA="abc"
myVarB="abc"
myVarC="def"

while [[ ${myVarA} != ${myVarB} ]]
    echo "A does not equal B"
    i=$(($i+1))
    do sleep 1s
    break
done

while [[ ${myVarA} == ${myVarB} ]]
    echo "A does equal B"
    i=$(($i+1))
    do sleep 1s
    break
done

while [[ ${myVarA} == ${myVarC} ]]
    echo "A does equal C"
    i=$(($i+1))
    do sleep 1s
    break
done

呈现以下内容,

+ myVarA=abc
+ myVarB=abc
+ myVarC=def
+ [[ abc != abc ]]
+ echo 'A does not equal B'
A does not equal B
+ i=1
+ sleep 1s
+ break
+ [[ abc == abc ]]
+ echo 'A does equal B'
A does equal B
+ i=2
+ sleep 1s
+ break
+ [[ abc == def ]]
+ echo 'A does equal C'
A does equal C
+ i=3
+ sleep 1s
+ break

【问题讨论】:

  • do 部分的 while 循环位于该块下方的几行。可能您应该将它们移到开头,即while [[ condition ]]; do
  • @Tom,感谢您的领导,下面的答案解释了诡计的情况一直延伸到 :do 并且我不明白。谢谢艺术

标签: bash comparison operators


【解决方案1】:

您的 do 关键字非常放错了位置。

whiledo 之间的所有内容都是条件列表。

所以你在第一个块中的条件列表是

[[ ${myVarA} != ${myVarB} ]]; echo "A does not equal B"; i=$(($i+1))

正如您想象的那样,它的计算结果为 true,因为 i=$(($i+1)) 的计算结果为 true

其他方块也是如此。

do 移动到while 行的末尾

while [[ ${myVarA} != ${myVarB} ]]; do
    : do something
done

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2018-06-23
    • 2014-10-31
    • 2015-05-19
    • 2012-01-07
    相关资源
    最近更新 更多