286

如何在单独的行上打印 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
4

7 回答 7

553

尝试这样做:

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

$@和的区别$*

  • 未引用,结果未指定。在 Bash 中,两者都扩展为单独的 args,然后是 wordsplit 和 globbed。

  • 引用,"$@"将每个元素扩展为一个单独的参数,同时"$*" 扩展为合并为一个参数的 args:("$1c$2c..."其中c第一个字符是IFS)。

你几乎总是想要"$@". 也一样"${arr[@]}"

总是引用他们!

于 2013-03-28T20:57:30.790 回答
85

只需引用 echo 的参数:

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

子外壳有助于在使用后恢复 IFS

于 2013-03-28T21:00:06.553 回答
53

用于:_

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

使用历史;请注意,如果您的值包含以下内容,这将失败!

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

使用基本名称;请注意,如果您的值包含以下内容,这将失败/

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

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

shuf -e "${alpha[@]}"
于 2015-05-20T02:32:36.203 回答
8

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

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

这看起来简单而紧凑

于 2017-02-04T00:07:43.050 回答
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 中。

于 2015-05-01T08:52:17.783 回答
1

你可以使用 Bash C Style For Loop 来做你想做的事。

my_array=(one two three)

for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three
于 2021-02-06T21:54:05.657 回答
0

我发现您可以使用 eval 来避免使用子外壳。因此:

IFS=$'\n' eval 'echo "${my_array[*]}"'
于 2020-12-22T18:19:53.317 回答