配列要素をBashの別の行に印刷しますか?


229

Bash配列の配列要素を別の行に出力するにはどうすればよいですか?これはうまくいきますが、確かにもっと良い方法があります:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

これを試してみましたが、うまくいきませんでした:

$ IFS=$'\n' echo ${my_array[*]}
one two three

回答:


436

これを試してください:

$ printf '%s\n' "${my_array[@]}"

違い$@$*

  • 引用されていない、結果は不特定です。Bashでは、どちらも展開して引数を分離し、次にワードスプリットとグロブ化を行います。

  • 引用され、"$@"各要素を個別の引数として"$*" 展開しますが、1つの引数にマージされた引数に展開します"$1c$2c..."(はのc最初の文字ですIFS)。

あなたはほとんど常に欲しいです"$@"。同じことが当てはまります"${arr[@]}"

常に引用してください!


5
また、内部スペースを持つ要素が誤って分割されないようにする場合は、変数参照を囲む二重引用符が重要です。
danfuzz 2013年

4
@sputnick:機能しません。配列の要素は1行になります
Axel Bregnsbo 2013年

1
コマンドの後の2つのハイフンは何ですか?マニュアルにはそれについての言及はありません。
joanpau 14

3
配列に要素がなくても空白行が出力されないようにする方法はあり| grep -v '^$'ますか?
Noel Yap

2
@espaciomore '%s \ n'は、printf関数の出力の形式です。%sは文字列引数(この場合は配列要素)のプレースホルダーを意味し、\ nはその後に改行を追加します。したがって、配列の各要素の出力には文字列と改行が含まれます。
Koja

71

引数を引用してエコーするだけです:

( IFS=$'\n'; echo "${my_array[*]}" )

サブシェルは、使用後のIFSの復元に役立ちます


3
申し訳ありませんが、私は「printf」関数について知ったからといって、あなたの解決策を好んでいるにもかかわらず、チェックマークをスプットニックに移動しました。
Axel Bregnsbo 2013年

3
この回答をありがとう-私はそれが好きです!展開後にひどい割り当てが発生するため、IFS=$'\n' echo "${my_array[*]}"機能しません。しかたがない!
cxw '14 / 12/16

@cxw、「割り当てが発生する」とはどういう意味ですか?
Steven Shaw

1
@bschlueter、私はBash 4 — 4.4.23(1)-release —で試してみましたが、うまくいきました!
Steven Shaw、

1
@cxwああ、私があなたがそこで何をしようとしていたのかわかりませんでした。echoはBashに組み込まれているため、機能しないと思います。ただし、これを関数にラップして機能させることはできます。gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
Steven Shaw

40

使用する

for each in "${alpha[@]}"
do
  echo "$each"
done

履歴を使用する; 値に以下が含まれている場合、これは失敗することに注意してください!

history -p "${alpha[@]}"

basenameを使用します。値に以下が含まれている場合、これは失敗することに注意してください/

basename -a "${alpha[@]}"

shufを使用します。結果が順番に出ない場合があることに注意してください:

shuf -e "${alpha[@]}"

19
「シャフ」...「きちんと出ないかもしれない」...陽気。
ウォルフ2017

4
シャフのために。誰がそれを使うことを考えたでしょうか?
fbicknel

3

私は巨大なfor ... ifループでここで答えを試しましたが、喜びは得られませんでした。

 # EXP_LIST2 is iterated    
 # imagine a for loop
     EXP_LIST="List item"    
     EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
 done 
 echo -e $EXP_LIST2

それはリストにスペースを追加しましたが、それは問題ありません-私はそれを少しインデントしたかったです。また、「\ n」が元の$ EP_LISTに出力されると想定します。


5
完全な例のようには見えません。
kenorb 2015

3

もう1つの便利なバリエーションは、次のパイプですtr

echo "${my_array[@]}" | tr ' ' '\n'

これはシンプルでコンパクトに見えます


11
これが壊れていることを除いてmy_array=( "one two" three )
マイク・ホルト

二重引用符で修正しました。
Steven Shaw、

Bashのバージョンで宣伝として動作しませんでした4+、使用していたecho "${my_array[@]}" | tr '' ' \n'個人的に私は使用を避けたいものの、echoどこ、そのようにtr私の選択は私のようなものだと思うtr '' ' \n' <<<"${my_array[@]}"後で読むために少し簡単かもしれませんが。
S0AndS0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.