Как лениво оценивать команды в оболочке для цикла - PullRequest
0 голосов
/ 11 октября 2018

Я хочу реализовать резервный механизм: если одна команда не сработает, попробуйте следующую или следующую (или следующую).Там может быть любое количество команд для обработки таким же образом.Следующая реализация (упрощенная, обработка ошибок должна быть лучше, но это не актуально) запускает все команды перед оценкой содержимого цикла for.Как мне сделать это ленивым?

f() {
  for message in $(cmd0) $(cmd1) $(cmd2) # cmd1, cmd2 should evaluate lazily
  do
    if [ $? == 0 ]
    then
      echo "ok: $message"
      return # exit early
    fi
  done
  echo "error: $message"
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы также можете сделать просто

f() { cmd0 || cmd1 || cmd2; }

, который оценивает cmd1 только в случае сбоя cmd0 и cmd2 только в случае сбоя cmd0 и cmd1.

0 голосов
/ 11 октября 2018

При условии, что ваши команды, cmd0, cmd1 возвращают 0 при успешном запуске и ненулевое значение при сбое, вы можете просто сделать

f() {
    for cmd in cmd0 cmd1 cmd2; do
        if "$cmd"; then
            echo "ok: $message"
            return
        fi
    done
}

См. Пример запускаемых команд, true,false с кодами возврата 0 и 1 соответственно,

f() {
    for cmd in false true; do
        echo "running command $cmd"
        if "$cmd"; then
            echo "ok: $message"
            return
        fi
    done
}

Запуск,

f
running command false
running command true
ok:
...