【发布时间】:2019-11-20 14:01:51
【问题描述】:
我想知道代码有没有错误
while true
do
var=$(curl http://${SERVER_HOST}:8060/vmc/vdisizer/api/v1/health) && echo "Got Reply from $SERVER_HOST" || echo "Curl failed to connect to $SERVER_HOST"
if [ "$var" -eq "OK" ]
then
echo "Success"
break
fi
done
这不起作用,我收到以下错误 -
int-tester_1 | curl: (52) Empty reply from server
我希望它持续轮询服务,直到服务回复“OK”,然后退出循环。
将 -eq 更改为 = 时,出现以下错误 -
int-tester_1 | + var=OK
int-tester_1 | Got Reply from 10.2.223.87
int-tester_1 | + echo 'Got Reply from 10.2.223.87'
int-tester_1 | + '[' = OK ']'
int-tester_1 | ./run_itests.sh: line 33: [: =: unary operator expected
【问题讨论】:
-
这不是造成当前问题的原因,而是
-eq进行整数比较,而不是字符串比较。在[ ]测试中,使用=进行字符串比较。另外,请注意,网页内容通常使用 CRLF 行尾,所以如果回复名义上是OK,实际上是OK\r\n(其中\r代表回车,\n代表换行);$()会修剪\n但留下\r,回车会导致两个字符串不相等。 -
得到以下错误 - ` int-tester_1 | + var=OK int-tester_1 |得到来自 10.2.223.87 int-tester_1 的回复 | + echo '得到来自 10.2.223.87 的回复' int-tester_1 | + '[' = OK ']' int-tester_1 | ./run_itests.sh: 第 33 行: [: =: 一元运算符应为 `
-
做出改变
-
一般来说,shellcheck.net 是调试 bash 脚本的最佳起点。
-
哦,这就解释了。当您将
var=部分放在( )中时,它会在子shell 中运行,并且对`var 的分配仅适用于该子shell。去掉括号。