web-dev-qa-db-ja.com

Linux Bashにはdo-whileループがありますか?

インターネットで検索したところ、Bashにはdo-whileループがないようです。

これは正しいです?これを確認するための信頼できる情報源はありますか(do-whileループがあるという証拠の欠如は、ループがないという議論ではありません、おそらくステートメントはunpopular)だけですか?

ディレクティブを自分で定義して、do-whileループを実装することは可能ですか? do-while-ループをwhile-ループしますが、これはnotこの質問の範囲です。

7

bash(または一般にPosixシェル)には、構文が冗長になるため、テスト後のループ(一般に「do-while」ループとして知られています)の明示的な構文がありません。 while複合ステートメントを使用すると、テスト前、テスト後、またはテスト中のループをすべて同じ構文で記述できます。

シェルwhileループのセマンティクスは次のとおりです Posix

Whileループの形式は次のとおりです。

while compound-list-1
do
  compound-list-2
done

複合リスト-1が実行され、終了ステータスがゼロ以外の場合、whileコマンドが完了します。それ以外の場合は、compound-list-2が実行され、プロセスが繰り返されます。

「化合物リスト」は一連のコマンドです。複合リストの終了ステータスは、リスト内の最後のコマンドの終了ステータスです。

つまり、whileループは次のように記述されていると考えることができます。

while
  optional-pre-test-compound-list
  condition
do
  post-test-compound-list
done

つまり、テストする条件がwhileキーワードの直後に続く必要はありません。したがって、C構文と同等です。

do statements while (test);

です

while statements; test do :; done

シェル文法では空のステートメントが許可されていないため、doとdoneの間の:が必要です。 :はメタ文字ではないため、前後に空白またはメタ文字が必要です。それ以外の場合は、先行または後続のトークンの一部として解析されます。コマンドとして解析されるため、その後にセミコロンまたは改行も必要です。それ以外の場合、done:への引数として扱われます。

30
rici

いいえ、bashにはdo-whileループがありません。 手動 セクション .2.4.1ループ構造 リストuntilwhile、およびfordo-whileはありません。

4
Elliott Frisch