文字列を単語に分割するためにread -aを使用できないのはなぜですか? [コピー]

文字列を単語に分割するためにread -aを使用できないのはなぜですか? [コピー]

in次の内容を含むサンプル入力ファイルがあります。

m@m-X555LJ:~/wtfdir$ cat in
asdf1 jkl1
asdf2 jkl2
asdf3 jkl3

次に、次を実行します。

m@m-X555LJ:~/wtfdir$ mapfile < ./in

予想通り、変数はMAPFILEファイルinを複数行に分割する配列です。

m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[0]}
asdf1 jkl1
m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[1]}
asdf2 jkl2

では、最初の行を単語に分割したいと思います。 AFAIKはread -a arrname標準入力から1行を読み取り、それを単語に分割して結果を配列に保存しますarrname。だから私は次のように入力します:

m@m-X555LJ:~/wtfdir$ echo ${MAPFILE[0]} | read -a words

私の精神モデルで何をすべきかはecho ${MAPFILE[0]}(つまり、単語に分けて結果を 。MAPFILEasdf1 jkl1read -a wordsreadwords

しかし残念ながら、このようなことは起こりませんでした。

m@m-X555LJ:~/wtfdir$ echo ${words[0]}

m@m-X555LJ:~/wtfdir$

はい。echo ${words[0]}何も印刷されませんが、予想通りasdf1

なぜこれが起こるのですか?そして私の間違いはどこにありますか?そしてそれを動作させる方法は何ですか?

答え1

これはあなたが望むことをするでしょう

read -a words <<< ${MAPFILE[0]}

そしてこれによると、 http://wiki.bash-hackers.org/commands/buildin/read 常に「-r」を使用してください。

read -r -a words <<< ${MAPFILE[0]}

$ echo ${words[0]}
asdf1

関連情報