whileループの終わりの構文は何ですか?

whileループの終わりの構文は何ですか?

次のBASHスクリプトコードから:

while read -r line
do
    if [some_condition]; then
        do_thing1
        do_thing2
        continue
    fi
done < $SOME_VAR

最後の行はどういう意味ですか?具体的には$SOME_VARの価値は何ですか?

答え1

<入力リダイレクト演算子であり、$SOME_VARファイル名を含めることができます。一緒にループがファイルから行を読み取るようにします。

答え2

<シェル間接演算子です。提供されたファイルをインポートし、前のコマンドの標準入力として使用します。コマンドはおおよそ次のようになります。

cat $SOME_VAR | while read -r line; do
  if stuff; then
     consequence
  else
     otherstuff
  fi
done

SOME_VAR現在の作業ディレクトリ(またはファイルのフルパス)に割り当てられているファイルがないと、シェルでエラーが発生しますNo such file or directory

答え3

他の2つの答えはすでにほとんどの側面をカバーしています。この構文を理解するには、その文を単一のwhile ... done複雑な文として解釈し、$SOME_VARその文をstdin.読み取りが必要になるたびに消費されますstdin。この場合の声明read。実際、標準構文と違いはありませんcmd <in >out

答え4

つまり、<リダイレクト文書実行中のコマンドまたはコマンドグループのストリームをシンボルの右側に割り当てます<stdin

これはwhile read -r line; do...done < input.txtファイルを読み取る標準的な方法です。一行ずつ。もちろん、$SOME_VARテキストファイルである必要はありません。名前付きパイプなどかもしれません。これは、シェルで単語分割の問題を回避するために使用される一般的なアプローチです。

シェルスクリプトに初めて触れる人は、同様のことができると思うことがよくありますfor line in $(cat file.txt)。ただし、各行にスペースで区切られた複数の単語がある場合、forループは各行の代わりに各単語を処理します。このような:

$ for i in $(cat input.txt); do echo "$i" ; done
one
two
three
four

これは良くありません。一方、whileループを使用すると、問題なく行全体を処理できます。

$ while read -r line; do echo "$line" ;done < input.txt
one two
three four

ただ使用しない理由が気になるかもしれませんが、cat | while read -r line...これは追加のプロセスです猫の無駄な使用


標準入力ストリームをループにリダイレクトすることも他の方法で実行できます。bashsupportを使用している場合は、<<<テキストの文字列リテラルをwhileループに送信できます。

while read -r line;do
    # do something with line
done <<< "Hello World"

重複する例ですか?はい、しかし、この構文は入力をwhileループにリダイレクトすることです。

また見なさい:

関連情報