2

我有一个带有 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
.............
4

2 回答 2

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
于 2013-06-03T00:26:14.093 回答
0

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

(编辑:显然也有杂散的换行符;我将其添加到 tr 的杀戮列表中,以防万一添加了一些……澄清……到 echo 命令以显示任何潜行的隐形。)

#!/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

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

于 2013-06-03T01:19:11.087 回答