Повторить команду только один раз: при сбое команды (в bash) - PullRequest
0 голосов
/ 29 мая 2020
 for ( i=3; i<5; i++)

 do

   execute some command 1

   if command 2 is successful then do not run the command 1 (the for loop should continue)

   if command 2 is not successful then run command 1 only once (like retry command 1 only once, after this the for loop should continue)    

done

Следует отметить, что команда 2 зависит от команды 1 и команда 2 может быть выполнена только после команды 1

, например:

 for ( i=3; i<5; i++)
 do
    echo "i" >> mytext.txt   ---> command 1 
    if "check the content of mytext.txt file to see if the value of i is  actually added" ---> command 2  
    if it is not added then execute echo "i" >> mytext.txt (command 1) again and only once.
    if i value is added to the file .. then exit and continue the loop
  done

Поскольку команда " 1 "довольно большой и не просто пример выражения эха здесь. Я не хочу добавлять" команду 1 "дважды ... один раз снаружи и один раз внутри условия if. Я хочу, чтобы этот logi c был оптимизирован без избыточности кода.

Ответы [ 2 ]

1 голос
/ 30 мая 2020

На комментарий похоже, что OP может потребоваться вызвать command 1 до 2 раз для данного $i значения, но хочет ввести command 1 только один раз в скрипте.

Siddhartha's Предложение использовать функцию, вероятно, достаточно хорошо, но в зависимости от фактического command 1 (OP упоминает, что он `` довольно большой '') я собираюсь сыграть в адвоката дьявола и предположить, что могут возникнуть дополнительные проблемы с передачей некоторых аргументов функции ( например, необходимость экранировать некоторые символы ... ??).

Общая идея состоит в том, чтобы иметь внутренний l oop, который может выполняться не более 2 раз, с logi c в l oop, что позволит «раньше» выйти (например, после всего лишь одного прохода через l oop).

Поскольку мы используем псевдокод, я буду использовать то же самое ...

for ( i=3; i<5; i++ )
do
    pass=1                                    # reset internal loop counter

    while ( pass -le 2 )
    do
        echo "i" >> mytext.txt                # command 1

        if ( pass -eq 1 )                     # after first 'command 1' execution
        && ( value of 'i' is in mytext.txt )  # command 2
        then
            break                             # break out of inner loop; alternatively ...
        #   pass=10                           # ensure pass >= 2 to force loop to exit on this pass
        fi

        pass=pass+1                           # on 1st pass set pass=2 => allows another pass through loop
                                              # on 2nd pass set pass=3 => will force loop to exit
    done
done
0 голосов
/ 29 мая 2020

вы можете объявлять такие функции, как

function command
{
  your_command -f params

}

for ( i=3; i<5; i++)

 do
   if command ; then 
      echo "success"
   else
      echo "retry"
      command
    fi

done

...