Это мой сценарий до цикла 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
Правильный ли путь?
Это в один конец.
Другой способ:
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
Было бы больше смысла.
Если вы классифицируете завершение цикла как «безуспешное», когда цикл завершается, тогда да, когда это произойдет, код выхода будет равен 1.
Сценарий, который вы написали, завершается с кодом выхода 1. Если он зацикливается вечно, то вы, очевидно, никогда не получите код выхода 1.
Все, что делает код выхода, это говорит вам об успешности последнего запуска. команда.
Если сценарий в вашем сообщении заканчивает цикл и завершается, попробуйте запустить это сразу после этого:
echo $?
Затем снова запустите echo $?
. Что ты видишь?
Как вы думаете, почему он изменился?
Вы, вероятно, уже поняли: тот факт, что вы выполнили успешную команду (в данном случае echo
, это могло быть почти что угодно) изменил состояние выхода на ноль.