Shell脚本while循环不退出

时间:2013-06-03 00:20:35

标签: bash shell while-loop wget

我有一个带有while循环的shell脚本,但没有退出。wget语句将返回truefalse。我需要执行奖励,直到价值为true

#!/bin/bash
status="false";
while [ "$status" != true ]
 do
  status=`wget -q -O - http://server`
  echo $status
  echo "Sleeping for 5 sec";
  sleep 5;
done

输出:

false
Sleeping for 5 sec
false
Sleeping for 5 sec
true
Sleeping for 5 sec
true
Sleeping for 5 sec
true
.............

2 个答案:

答案 0 :(得分:0)

您的脚本中存在一些引用问题,并且您启动子shell的方式是无效的语法。

此外,您应该确保没有尾随空格或其他字符:

#!/bin/bash
status="false";
# quote the "true"
while [ "$status" != "true" ]
 do
  # use $(...) to start a sub shell
  status=$(wget -q -O - http://server)
  # add >> << to make extra space visible. use quotes
  echo ">>$status<<"
  echo "Sleeping for 5 sec";
  sleep 5;
done

答案 1 :(得分:0)

我无法确定,但我怀疑问题是响应是从带有CRLF行终止符的服务器返回的(即回车字符后跟换行符)。当shell在wget ...上执行命令替换时,它会修剪结束换行符,但不会回滚回车符;结果,“$ status”不是“true”,它是“true \ r”(用\ r表示CR)。您可以使用tr命令去除CR并避免混淆:

(编辑:显然也有流浪的新行;我把它添加到tr的杀戮列表中,以防万一...添加一些......澄清...到echo命令以显示潜行的任何隐形。)< / p>

#!/bin/bash
status="false";
while [ "$status" != true ]
 do
  status=$(wget -q -O - http://server | tr -d "\r\n")
  echo "'$status'" | cat -v
  echo "Sleeping for 5 sec"
  sleep 5
done

(我还删除了一些冗余分号并用$( ... )替换了反引号命令替换 - 它做了同样的事情,但更容易阅读并避免了嵌套和转义的一些奇怪的语法故障)。