Bashでread
コマンドを次のように使用しようとすると:
echo hello | read str
echo $str
str
には文字列hello
を含めるべきだと思いますが、何もエコーしませんでした。誰もこの行動を理解するのを手伝ってもらえますか?
スクリプトコマンドのread
は問題ありません。ただし、パイプラインで実行します。つまり、サブシェルにあるため、読み取る変数は親シェルには表示されません。あなたはどちらか
サブシェル内の残りのスクリプトも移動します。
echo hello | { read str
echo $str
}
または、コマンド置換を使用して、サブシェルから変数の値を取得します
str=$(echo hello)
echo $str
またはもう少し複雑な例(lsの2番目の要素を取得する)
str=$(ls | { read a; read a; echo $a; })
echo $str
サブシェルを含まない他のbashの代替:
read str <<END # here-doc
hello
END
read str <<< "hello" # here-string
read str < <(echo hello) # process substitution
典型的な使用法は次のようになります。
i=0
echo -e "hello1\nhello2\nhello3" | while read str ; do
echo "$((++i)): $str"
done
および出力
1: hello1
2: hello2
3: hello3
Readコマンドは別のサブシェルで実行されるため、値は表示されなくなります。 Bash FAQ 24
ここに私の2セントを入れるには:KSHでは、read
ingを変数にそのままwill動作します、なぜなら IBM AIXのドキュメント 、KSHのread
doesは現在のシェル環境に影響します。
Readコマンドによるシェル変数の設定は、現在のシェル実行環境に影響します。
これにより、AIXで数十億回使用したread
で終わるワンライナーがLinuxで動作しなかった理由を解明するのにかなりの時間を費やしました...それはKSHが保存するためです現在の環境ではBASHはそうではありません!
私は本当に「while」とdoループでreadを使用します:
echo "This is NOT a test." | while read -r a b c theRest; do
echo "$a" "$b" "$theRest"; done
これはテストです。
その価値については、bashのreadコマンドで常に-rを使用することをお勧めします。