bash在单独的行上打印数组元素

问题描述 投票:169回答:5

如何在单独的行上打印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
arrays bash
5个回答
343
投票

试着这样做:

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

$@$*之间的区别:

  • 未加引号,结果未指定。在Bash中,两者都扩展为单独的args,然后是wordsplit和globbed。
  • 引用,"$@"扩展每个元素作为一个单独的参数,而"$*"扩展到args合并为一个参数:"$1c$2c..."(其中cIFS的第一个字符)。

你几乎总是想要"$@"。同样适用于"${arr[@]}"

总是引用它们!


61
投票

只需引用echo的参数:

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

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


29
投票

用于:

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

使用历史;请注意,如果您的值包含!,则会失败:

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

使用basename;请注意,如果您的值包含/,则会失败:

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

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

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

3
投票

我在这里尝试了一个巨大的答案......如果循环,但没有得到任何喜悦 - 所以我这样做,也许是凌乱但是做了工作:

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


2
投票

另一个有用的变体是管道到tr

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

这看起来简单而紧凑

© www.soinside.com 2019 - 2024. All rights reserved.