Назад | Перейти на главную страницу

Попробуйте выполнить команду несколько раз

Мне нужно выполнить команду, а также проверить, была ли она успешной. Если произошла ошибка, я должен попробовать еще раз, и следующий код работает должным образом.

Но что, если мне нужно попробовать одну и ту же команду 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

Если вы предпочитаете, вы можете использовать стиль c для цикла

 #!/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.

редактировать. По просьбе ваших дружелюбных модераторов заглядывать, существенный трепать торт. Ура, торт!

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.