Мне нужно выполнить команду, а также проверить, была ли она успешной. Если произошла ошибка, я должен попробовать еще раз, и следующий код работает, как ожидалось.
Но что, если мне нужно попробовать выполнить одну и ту же команду 3 или 4 раза, пока она не будет успешно выполнена? Пункт if / else станет довольно сложным.
some command
if [ $? -eq 0 ];then
echo "success"
else
echo "failed first attempt trying again"
some command
if [ $? -eq 0 ];then
echo "success in second attempt"
else
echo "failed second attempt"
fi
fi
Есть ли лучший способ написать сценарий, который будет пробовать команду 4 раза, прежде чем выйти?
Используйте цикл для выполнения / usr / local / some / command столько раз, сколько требуется MAX_TRIES. Если все попытки выполнения безуспешны, произойдет ошибка с кодом $ ERR. Если это успешно, он немедленно выйдет из 0 и выйдет из цикла.
#!/bin/bash
ERR=1 # or some non zero error number you want
MAX_TRIES=4
COUNT=0
while [ $COUNT -lt $MAX_TRIES ]; do
/usr/local/some/command
if [ $? -eq 0 ];then
exit 0
fi
let COUNT=COUNT+1
done
echo "Too many non-successful tries"
exit $ERR
Если вы предпочитаете, вы можете использовать стиль переменного тока для цикла
#!/bin/bash
ERR=1 # or some non zero error number you want
MAX_TRIES=4
for (( i=1; i<=$MAX_TRIES; i++ ))
do
/usr/local/some/command
if [ $? -eq 0 ];then
exit 0
fi
done
echo "Too many non-sucessful tries"
exit $ERR
Я действительно не могу задаться вопросом, как вы не можете узнать о цикле while .
Править . По просьбе ваших дружелюбных модераторов приготовьте дроп-ин , существенный bash торт. Ура, торт!
while [ $w_count -lt $w_maxtries ]; do
some command
if [ $? -ne 0 ]; then
# cmd failed
let w_count=w_count+1
# optional, consider redirecting to STDERR.
echo "Warning, command failed the ${w_count}th time!"
if [[ $w_count -ge $(( $w_maxtries - 1 )) ]]; then
# whoops too many tries
echo "Giving up"
exit 1
fi
else
# Yay it worked
break
fi
done
# continue here.