Выход 1, когда цикл не завершится

Это мой сценарий до цикла bash , который пытается выполнить команду ssh на удаленном компьютере:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && break 
   n=$(($n+1))
   sleep 5
done

Я хочу, чтобы выполнялся выход 1, когда цикл завершился безуспешно.

Я нашел следующее решение:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && exit 0 
   n=$(($n+1))
   sleep 5
done
exit 1

Правильный ли путь?

0
09.05.2017, 19:27
2 ответа

Это в один конец.

Другой способ:

until [ "$n" -ge 5 ] && exit 1; do
  ... && break
done
echo OK
exit 0

Или:

while [ "$n" -lt 5 ] || exit; do
  ... && break
done

Хотя здесь похоже, что вы хотите повторять команду ssh до тех пор, пока она не завершится успешно, и прервать после стольких попыток, поэтому:

n=5
until
  ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir"
do
  n=$((n - 1))
  if [ "$n" -eq 0 ]; then
    echo >&2 giving up
    exit 1
  fi
done

echo OK
exit 0

Было бы больше смысла.

3
28.01.2020, 02:33

Если вы классифицируете завершение цикла как «безуспешное», когда цикл завершается, тогда да, когда это произойдет, код выхода будет равен 1.

Сценарий, который вы написали, завершается с кодом выхода 1. Если он зацикливается вечно, то вы, очевидно, никогда не получите код выхода 1.

Все, что делает код выхода, это говорит вам об успешности последнего запуска. команда.

Если сценарий в вашем сообщении заканчивает цикл и завершается, попробуйте запустить это сразу после этого:

echo $?

Затем снова запустите echo $?. Что ты видишь? Как вы думаете, почему он изменился? Вы, вероятно, уже поняли: тот факт, что вы выполнили успешную команду (в данном случае echo, это могло быть почти что угодно) изменил состояние выхода на ноль.

-1
28.01.2020, 02:33

Теги

Похожие вопросы