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 

尝试这样做:

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

$@$*之间的区别:

  • 没有引用,结果是不明确的。 在Bash中,两者都扩展为分开的参数,然后是分词和globbed。

  • 引用"$@"作为单独的参数扩展每个元素,而"$*"扩展为合并到一个参数"$1c$2c..." (其中cIFS的第一个字符)的参数。

你几乎总是想要"$@""${arr[@]}"

总是引用他们!

只要引用参数echo:

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

子shell有助于在使用后恢复IFS

用于

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

使用历史 ; 注意如果你的值包含,这将失败!

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

使用基本名称 ; 注意如果你的值包含/这将失败

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

使用shuf ; 注意结果可能不会按顺序出现:

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

我试图在这个巨人的答案…如果循环,但没有得到任何喜悦 – 所以我这样做,也许是凌乱的,但做了这个工作:

  # 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中。

另一个有用的变体是pipe to tr

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

这看起来简单而紧凑