【问题标题】:While loop never endswhile循环永远不会结束
【发布时间】:2011-01-20 14:40:28
【问题描述】:

我正在使用 bash,我正在尝试做这样的事情:

A=1
while [ $A=1 ]; do
    read line
    echo $line | grep test >/dev/null   
    A=$?
    echo $A
done 

即使 grep 成功完成并且 A 设置为 0,此脚本也永远不会结束。我在这里缺少什么?以下是输出示例。

$ ./test.sh

asdf

1

测试

0

嗯...

1

【问题讨论】:

  • $A=1 没有设置 $A 为 1。这里的 = 会充当比较运算符,但是类型错误...另外,间距不正确

标签: bash shell loops while-loop


【解决方案1】:

您需要使用正确的比较运算符。 Bash 对于整数和字符串比较有不同的操作符。

此外,您需要在比较表达式中设置正确的间距。

你需要

while [ $A -eq 1 ]; do

更多信息请见here

【讨论】:

    【解决方案2】:

    我发现 Bash 的语法很糟糕 - 你有没有尝试过类似的东西:

    而 [ $A -eq 1 ] ... ?

    它可能试图将 1 重新分配给 $A 或类似的奇怪的东西。

    【讨论】:

    • 或至少在操作数和= 运算符之间放置空格。
    • 在这种情况下,= 符号仍然是一个比较...但它是一个字符串比较。空白是关键方面
    • @Dancrumb 很高兴认识大家(不是说我做太多 bash 编程!)谢谢,安迪。
    【解决方案3】:

    试试:

    while [ $A -eq 1 ]; do
    

    【讨论】:

    • 间距很关键——正如所写的没有空格,测试运算符正在检查 '0=1' 是否为空字符串,但事实并非如此,测试通过并且循环继续。
    【解决方案4】:

    大多数答案都集中在整数/字符串和间距问题上,这很好,但是您的代码看起来很单一,以至于 IMO 应该完全重构它。假设这个想法是处理行,直到一行匹配正则表达式“测试”:

    while read line; do      
      if [[ "$line" =~ test ]] && break
      # do something with $line
    done
    

    当然,如果您利用 sed 等文本处理工具,这可以进一步简化:

    sed -e '/test/,$d'
    

    【讨论】:

      【解决方案5】:

      您可以改为这样做。无需调用外部 grep。

      while true; do
          read line
          case "$line" in
            *test* ) break;;
          esac
      done 
      echo $line
      

      【讨论】:

      【解决方案6】:

      你没试过这个

      而 [ $A == "1" ] …… 完毕

      编辑: 哎呀,因为 Dan 提到了我的错误,我欣然承认我的错误并相应地进行了编辑 - 谢谢 请注意...

      而 [ $A -eq 1 ] …… 完毕

      对不起! :( 希望这可以帮助, 最好的祝福, 汤姆。

      【讨论】:

      • 这是字符串比较运算符,不是整数比较运算符
      • @Dancrumb:OP 正在读取来自 bash 脚本的字符输入......不是真正的整数......除非你愿意解释?感谢您的输入! :)
      • 当然。该脚本将调用 grep 的返回码放在 $A 中,因此该值肯定是数字……零或 1
      • @Dancrumb:天哪!从来没有见过...是的$?是错误级别的代码...哎呀我的坏...嗯!谢谢丹.... :) 对不起!
      【解决方案7】:

      您的所有答案都在Advanced Bash-Scripting guide 中。太棒了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        相关资源
        最近更新 更多