web-dev-qa-db-ja.com

Bashでreadコマンドを使用する方法は?

Bashでreadコマンドを次のように使用しようとすると:

echo hello | read str
echo $str

strには文字列helloを含めるべきだと思いますが、何もエコーしませんでした。誰もこの行動を理解するのを手伝ってもらえますか?

52
Determinant

スクリプトコマンドのreadは問題ありません。ただし、パイプラインで実行します。つまり、サブシェルにあるため、読み取る変数は親シェルには表示されません。あなたはどちらか

  • サブシェル内の残りのスクリプトも移動します。

    echo hello | { read str
      echo $str
    }
    
  • または、コマンド置換を使用して、サブシェルから変数の値を取得します

    str=$(echo hello)
    echo $str
    

    またはもう少し複雑な例(lsの2番目の要素を取得する)

    str=$(ls | { read a; read a; echo $a; })
    echo $str
    
56
jpalecek

サブシェルを含まない他のbashの代替:

read str <<END             # here-doc
hello
END

read str <<< "hello"       # here-string

read str < <(echo hello)   # process substitution
38
glenn jackman

典型的な使用法は次のようになります。

i=0
echo -e "hello1\nhello2\nhello3" | while read str ; do
    echo "$((++i)): $str"
done

および出力

1: hello1
2: hello2
3: hello3
8
Shizzmo

Readコマンドは別のサブシェルで実行されるため、値は表示されなくなります。 Bash FAQ 24

3
l0b0

ここに私の2セントを入れるには:KSHでは、readingを変数にそのままwill動作します、なぜなら IBM AIXのドキュメント 、KSHのreaddoesは現在のシェル環境に影響します。

Readコマンドによるシェル変数の設定は、現在のシェル実行環境に影響します。

これにより、AIXで数十億回使用したreadで終わるワンライナーがLinuxで動作しなかった理由を解明するのにかなりの時間を費やしました...それはKSHが保存するためです現在の環境ではBASHはそうではありません!

2
RAKK

私は本当に「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を使用することをお勧めします。

0
JackDR