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

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

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

1
задан 9 July 2013 в 14:26
2 ответа

Используйте цикл для выполнения / 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
11
ответ дан 3 December 2019 в 16:17

Я действительно не могу задаться вопросом, как вы не можете узнать о цикле 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.
-1
ответ дан 3 December 2019 в 16:17

Теги

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