在Bash中的不同行上打印数组元素?


229

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

Answers:


436

尝试这样做:

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

$@和之间的区别$*

  • 未引用,结果未指定。在Bash中,两者都展开为单独的args,然后进行单词拆分和修改。

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

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

总是引用它们!


5
请注意,如果要确保不会无意间分隔带有内部空格的元素,则变量引用周围的双引号很重要。
danfuzz

4
@sputnick:不工作,阵列元件最终在一行
阿克塞尔Bregnsbo

1
命令后的两个连字符是什么?我在手册中找不到任何引用。
joanpau 2014年

3
有没有一种方法可以使数组中没有任何元素而不必输出空白行| grep -v '^$'呢?
Noel Yap

2
@espaciomore'%s \ n'是printf函数输出的格式。%s表示一个字符串参数(在本例中为数组元素)的占位符,\ n在此之后添加换行符。因此,数组中每个元素的输出中都会有一个字符串和一个换行符。
Koja

71

只需引用要回显的参数即可:

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

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


3
对不起,Perreal,尽管我更喜欢您的解决方案,但我还是把复选标记移到了Sputnick,因为我了解了'printf'函数。
Axel Bregnsbo

3
感谢您的回答-我喜欢!扩展后发生的分配IFS=$'\n' echo "${my_array[*]}"工作太差,因此无法正常工作。那好吧!
cxw

@cxw,“分配发生”是什么意思?
史蒂文·肖

1
@bschlueter,我尝试使用Bash 4(4.4.23(1)-发行版),并且有效!
史蒂文·肖

1
@cxw啊,我没有看到您正在尝试做什么。我认为它不起作用,因为它echo是Bash内置的。但是,您可以将其包装在一个函数中,它将起作用!gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
史蒂文·肖

40

使用

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

利用历史 ; 请注意,如果您的值包含!

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

使用basename ; 请注意,如果您的值包含/

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

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

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

19
“ shuf”……“可能无法按顺序出来”……好笑。
Walf

4
为shuf。谁会想到使用它?
fbicknel

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

尽管这在列表中增加了一个空格,这很好-我希望它缩进一点。还要假定可以在原始$ EP_LIST中打印“ \ n”。


5
看起来不像一个完整的例子。
kenorb

3

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

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

这看起来简单紧凑


11
除了这打破上my_array=( "one two" three )
迈克霍尔特

修复了双引号。
史蒂文·肖

不能使用Bash版本4+ 上的广告,必须使用echo "${my_array[@]}" | tr '' ' \n',尽管就我个人而言,我会避免echo那样使用,但tr我认为类似的tr '' ' \n' <<<"${my_array[@]}"内容稍后可能会更容易阅读。
S0AndS0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.