回答:
これを行う1つの方法を次に示します。
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
実行するだけであれば、Ctrl + D(EOF)を押すまで標準入力から読み続けます。その後、入力した行はになりますmy_array
。このコードはわかりにくいかもしれません。ループの本体は基本的に言うmy_array = my_array + element
。
興味深いドキュメントの一部:
read -r
時々非常に有用/重要です...「組み込みのマンページを読む」へのステファノのリンクはその目的を説明します...(バックスラッシュの解釈を防ぐため)。
そして、毎回配列を再作成しないもの(bash 3.1以降が必要です):
array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
[[ $line ]] || break # break if line is empty
array+=("$line")
done
printf '%s\n' "Items read:"
printf ' «%s»\n' "${array[@]}"
詳細については、http://mywiki.wooledge.org/BashFAQ/001を参照してください。
そしていつものように、バグを書くことを避けるためにhttp://mywiki.wooledge.org/BashGuideを読み、Advanced bashスクリプトガイドのようなtldpガイドを避けてください。
IFS
問題を指摘してくれてありがとう。それをゼロにすることなく、sriptsはすべての先頭と末尾の空白を「読み取り」...そしてもちろん-r
、あまりにも...
このワンライナーはどうですか;)
arr=( $(cat -) )
echo ${arr[@]}
編集:
でbash
、
arr=(val1 val2 ...)
は、配列に割り当てる方法です。これをコマンド置換と組み合わせて使用すると、パイプラインから配列を読み込むことができますが、これを簡単に行うことはできませんread
。
echo -e "a\nb" | read -a arr
echo ${arr[@]}
パイプラインがサブシェルで実行され、変数がまったく使用できread
ない場合stdin
があるため、パイプの場合は何もしないため、何も出力されないことがわかります。
この答えが示唆する方法を使用して:
arr=(`echo -e "a\nb"`)
echo ${arr[@]}
これは、与えa b
道よりシンプルかつストレートフォワードの答えによって与えられた任意の回避策よりなるパイプからシェル変数に読み取り値とパイプが値を設定されていない後にbashで読ま。
cat war_and_peace.txt | ./array_test.sh
ます。