而循环永远不会结束

时间:2010-02-24 16:05:55

标签: bash shell loops while-loop

我正在使用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

HM ...

1

7 个答案:

答案 0 :(得分:8)

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

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

你需要

while [ $A -eq 1 ]; do

有关详情,请参阅here

答案 1 :(得分:5)

我发现Bash的语法非常糟糕 - 你尝试过类似的东西吗?

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

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

答案 2 :(得分:4)

尝试:

while [ $A -eq 1 ]; do

答案 3 :(得分:3)

大多数答案都集中在整数/字符串和间距问题上,这很好,但是你的代码看起来非常简单,IMO应该完全重新考虑。假设这个想法是处理行,直到一行匹配正则表达式'test':

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

当然,如果您利用sed:

等文本处理工具,可以进一步简化这一过程
sed -e '/test/,$d'

答案 4 :(得分:1)

你可以这样做。无需调用外部grep。

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

答案 5 :(得分:-1)

你没试过这个

while [ $A == "1" ]
   ....
done

修改哎呀 Dan 提到我的错误我慷慨地承认我的错误,并相应地对其进行了编辑 - 谢谢 为抬头......

while [ $A -eq 1 ]
   ....
done

抱歉! :( 希望这可以帮助, 最好的祝福, 汤姆。

答案 6 :(得分:-1)

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