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
これを試してみてください:
$ printf '%s\n' "${my_array[@]}"
$@
と$*
の違い:
引用符なしで、結果は不定です。 Bashでは、両方とも展開して個別のargsを作成し、その後wordslitとglobbedを実行します。
引用符で囲んだ"$@"
は各要素を個別の引数として展開し、"$*"
は1つの引数に統合された引数に展開します:"$1c$2c..."
(c
はIFS
の最初の文字です)。
ほとんどの場合、"$@"
が必要です。 "${arr[@]}"
についても同様です。
常に引用してください!
Echoの引数を引用するだけです:
( IFS=$'\n'; echo "${my_array[*]}" )
サブシェルは使用後のIFSの復元に役立ちます
forを使う:
for each in "${alpha[@]}"
do
echo "$each"
done
history;を使う値に!
が含まれているとこれが失敗することに注意してください。
history -p "${alpha[@]}"
basename;を使う値に/
が含まれているとこれが失敗することに注意してください。
basename -a "${alpha[@]}"
shuf;を使う結果が順番どおりにならない可能性があることに注意してください。
shuf -e "${alpha[@]}"
別の便利な変種はtr
へのパイプです。
echo "${my_array[@]}" | tr ' ' '\n'
これはシンプルでコンパクトに見えます
私はここで巨大な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に印刷される可能性があるとします。