我有一个单行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#
我在做什么错?
首先,请不要假设sh
和bash
相同。在大多数地方它们不是,甚至当以bash
调用时,甚至sh
的行为也会有所不同。
此刻,您的until
条件始终求值为true
,因为该表达式仅被视为非空字符串。演示:
$ [ ==OK ] && echo yo
yo
[请记住,[
是/bin/test
的别名。您可以使用man test
作为文档,但简单的答案是,使用单个等号,并在所有内容之间使用空格。哦,引用variables,而不是无特殊字符的常量。
也许是这样:
# bash -c "until [[ "$response" = OK ]]; do response="$(nc -w5 <redis IP> <redis port> <<<$'AUTH <redis pw>\r\n')"; echo "$response"; done"