为什么这一行 until loop 没有按预期运行?

Why is this one line until loop not behaving as expected?

我有这一行 shell 脚本,我在其中尝试连续连接到我的 Redis 服务器,直到建立连接(成功时输出 'OK')。但是,我一定是做错了什么,因为脚本似乎没有……什么都没有。

bash-5.0# sh -c "until [ $response=="OK" ]; do response="$((printf "AUTH <redis pw>\r\n") | nc -w5 <redis IP> <redis port>)"; echo $response; done;"
bash-5.0#

我做错了什么?

首先,不要假设 shbash 相同。在大多数地方它们不是,甚至 bash 在被调用为 sh.

时也会有不同的行为

目前,您的 until 条件始终计算为 true,因为该表达式仅被视为非空字符串。演示:

$ [ ==OK ] && echo yo
yo

请记住 [/bin/test 的别名。您可以 man test 获取文档,但简短的回答是,使用一个等号,并在所有内容周围使用空格。哦,引用 变量 ,而不是无特殊字符的常量。

此外,请注意您的报价。您在 until 之前开始一个双引号字符串,然后在 OK 之前结束它。如果你想在双引号内嵌入双引号,你需要转义它们。但如果你能避免它们,它甚至是 better/clearer。

也许是这样:

# bash -c 'until [[ "$response" = OK ]]; do response="$(printf "AUTH %s\r\n" "$redis_pw" | nc -w5 <redis IP> <redis port> )"; echo "$response"; done'

或者如果你更喜欢 POSIXy 而不是依赖 bash:

# sh -c 'until [ "$response" = OK ]; do response="$(printf "AUTH %s\r\n" "$redis_pw" | nc -w5 <redis IP> <redis port>)"; echo "$response"; done'