ユーザー入力をBashの配列として読み取るにはどうすればよいですか?


15

ユーザー入力をbashシェルの配列として読み取るにはどうすればよいですか?


私はあなたが標準入力から読みたいと思っていますか?私の答えはのような実行でも機能しcat war_and_peace.txt | ./array_test.shます。
ステファノパラッツォ

または単に./array_test.sh < war_and_peace.txt
エリアケイガン

回答:


14

これを行う1つの方法を次に示します。

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

実行するだけであれば、Ctrl + D(EOF)を押すまで標準入力から読み続けます。その後、入力した行はになりますmy_array。このコードはわかりにくいかもしれません。ループの本体は基本的に言うmy_array = my_array + element

興味深いドキュメントの一部:


3
read -r時々非常に有用/重要です...「組み込みのマンページを読む」へのステファノのリンクはその目的を説明します...(バックスラッシュの解釈を防ぐため)。
Peter.O

10

これを使用して読んでください:

read -a arr

また、印刷には次を使用します。

for elem in ${arr[@]}
do 
  echo $elem
done

4

そして、毎回配列を再作成しないもの(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、あまりにも...
Peter.O

0

このワンライナーはどうですか;)

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で読ま


テストしましたか?
cmak.fr

@ cmak.frはい、それは私のために働く
クォーク

@Melebius私はそれとこのワンライナーの利点の説明を追加しました。
嘉H徐
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.