次の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...
これは追加のプロセスです猫の無駄な使用。
標準入力ストリームをループにリダイレクトすることも他の方法で実行できます。bash
supportを使用している場合は、<<<
テキストの文字列リテラルをwhileループに送信できます。
while read -r line;do
# do something with line
done <<< "Hello World"
重複する例ですか?はい、しかし、この構文は入力をwhileループにリダイレクトすることです。
また見なさい: