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]}
(つまり、単語に分けて結果を 。MAPFILE
asdf1 jkl1
read -a words
read
words
しかし残念ながら、このようなことは起こりませんでした。
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