Как вырваться из цикла в Bash?

150

Я хочу написать сценарий Bash для обработки текста, который может потребовать цикла while.

Например, цикл while в C:

int done = 0;
while(1) {
  ...
  if(done) break;
}

Я хочу написать сценарий Bash, эквивалентный этому. Но то, что я обычно использовал и как показали все классические примеры, которые я прочитал, это:

while read something;
do
...
done

Он не предлагает никакой помощи о том , как делать while(1){}и break;, что хорошо определены и широко используется в C, и я не должен читать данные для стандартного ввода.

Может ли кто-нибудь помочь мне с Bash-эквивалентом приведенного выше кода C?

lulyon
источник

Ответы:

189

Это не так уж и отличается bash.

done=0
while : ; do
  ...
  if [ "$done" -ne 0 ]; then
      break
  fi
done

:команда no-op; его состояние выхода всегда равно 0, поэтому цикл выполняется до тех пор, doneпока ему не будет присвоено ненулевое значение.


Есть много способов установить и проверить значение done, чтобы выйти из цикла; тот, который я показываю выше, должен работать в любой POSIX-совместимой оболочке.

chepner
источник
Это нормально использовать doneв качестве имени переменной? Это ключевое слово в оболочке ... По крайней мере, сбивает с толку.
Майкл Дорст
59
while true ; do
    ...
    if [ something ]; then
        break
    fi
done
Lurker
источник