
私が経験したテストの問題は次のとおりです。
次のコマンドシーケンスはどの出力を生成しますか?
echo '1 2 3 4 5 6' | while read a b c; do
echo result: $c $b $a;
done
正解は次のとおりです。3 4 5 6 2 1
理由はわかりません。誰かが私にこれを説明できますか?
(最初は答えが「はい」だと思いました3 2 1
。)
答え1
マンページで以下を読んでください。
標準入力または-uオプションが指定されている場合は、ファイル記述子FDから行を読み取ります。単語分割と同様に、行は最初の単語が最初のNAMEに割り当てられ、2番目の単語が2番目のNAMEに割り当てられるなどのフィールドに分割され、残りのすべての単語は最後のNAMEに割り当てられます。 $ IFSの文字のみが単語区切り文字として認識されます。
このため、私は通常「ゴミ」変数を使用して、残っているすべてを収集します。
echo '1 2 3 4 5 6' | while read a b c TRASH; do
echo "result is: $c $b $a"
echo "trash is: $TRASH"
done
使用中:
$ echo '1 2 3 4 5 6' | while read a b c TRASH; do
> echo "result is: $c $b $a"
> echo "trash is: $TRASH"
> done
result is: 3 2 1
trash is: 4 5 6