web-dev-qa-db-ja.com

個別の行にプリント配列要素をbashする

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
174
Axel Bregnsbo

これを試してみてください:

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

$@$*の違い:

  • 引用符なしで、結果は不定です。 Bashでは、両方とも展開して個別のargsを作成し、その後wordslitとglobbedを実行します。

  • 引用符で囲んだ"$@"は各要素を個別の引数として展開し、"$*"は1つの引数に統合された引数に展開します:"$1c$2c..."cIFSの最初の文字です)。

ほとんどの場合、"$@"が必要です。 "${arr[@]}"についても同様です。

常に引用してください!

372
Gilles Quenot

Echoの引数を引用するだけです:

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

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

61
perreal

forを使う:

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

history;を使う値に!が含まれているとこれが失敗することに注意してください。

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

basename;を使う値に/が含まれているとこれが失敗することに注意してください。

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

shuf;を使う結果が順番どおりにならない可能性があることに注意してください。

shuf -e "${alpha[@]}"
31
Steven Penny

別の便利な変種はtrへのパイプです。

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

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

3
0x00

私はここで巨大な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に印刷される可能性があるとします。

3
wuxmedia