Почему эта строка пока l oop ведет себя не так, как ожидалось? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть этот однострочный сценарий оболочки, в котором я пытаюсь непрерывно подключаться к моему серверу Redis, пока соединение не будет установлено (выводит «ОК» в случае успеха). Тем не менее, я, должно быть, что-то делаю не так, как кажется, что сценарий ничего не делает ...

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#

Что я делаю не так?

1 Ответ

2 голосов
/ 11 февраля 2020

Прежде всего, не думайте, что sh и bash одинаковы. В большинстве случаев это не так, и даже bash будет вести себя по-разному, когда вызывается как sh.

. В настоящее время ваше условие until всегда оценивается как true, поскольку выражение считается просто ненулевая строка. Для демонстрации:

$ [ ==OK ] && echo yo
yo

Помните, что [ является псевдонимом для /bin/test. Вы можете man test для документирования, но краткий ответ таков: используйте одинаковые равенства и пробелы вокруг всего. Да, и процитируйте переменные , а не константы без специальных символов.

Кроме того, следите за своими кавычками. Вы начинаете строку с двойными кавычками перед until, а затем заканчиваете ее до OK. Если вы хотите встроить двойные кавычки в двойные кавычки, вам нужно их избежать. Но еще лучше / яснее, если вы можете избежать их.

Возможно, это:

# 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'
...