我有一个带有while循环的shell脚本,但没有退出。wget
语句将返回true
或false
。我需要执行奖励,直到价值为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
.............
答案 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
(我还删除了一些冗余分号并用$( ... )
替换了反引号命令替换 - 它做了同样的事情,但更容易阅读并避免了嵌套和转义的一些奇怪的语法故障)。