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

Axe*_*sbo 203 arrays bash

如何在单独的行上打印Bash数组的数组元素?这个有效,但肯定有更好的方法:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three
Run Code Online (Sandbox Code Playgroud)

试过这个,但它不起作用:

$ IFS=$'\n' echo ${my_array[*]}
one two three
Run Code Online (Sandbox Code Playgroud)

Gil*_*not 387

试着这样做:

$ printf '%s\n' "${my_array[@]}"
Run Code Online (Sandbox Code Playgroud)

$@和之间的区别$*:

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

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

你几乎总是想要"$@".同样如此"${arr[@]}".

总是引用它们!

  • 请注意,如果要确保具有内部空间的元素不会被无意中拆分,则变量引用周围的双引号很重要. (5认同)
  • @sputnick:不起作用,数组元素最后一行 (3认同)
  • 是否有一种方法可以使它不输出任何空白行,如果数组中没有元素而不必`| grep -v'^ $'`? (3认同)
  • @espaciomore'%s \n'是printf函数输出的格式.%s表示字符串参数的占位符(在本例中为数组元素),\n之后添加换行符.因此,对于数组中的每个元素,输出中将存在字符串和换行符. (2认同)

per*_*eal 66

只需引用echo的参数:

( IFS=$'\n'; echo "${my_array[*]}" )
Run Code Online (Sandbox Code Playgroud)

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

  • 对不起,我把我的复选标记移到了sputnick,尽管更喜欢你的解决方案,只是因为我了解了'printf'功能. (3认同)
  • 谢谢你的回答 - 我喜欢它!扩展后发生了太糟糕的分配,因此`IFS = $'\n'echo"$ {my_array [*]}"`不起作用.那好吧! (3认同)

小智 38

使用:

for each in "${alpha[@]}"
do
  echo "$each"
done
Run Code Online (Sandbox Code Playgroud)

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

history -p "${alpha[@]}"
Run Code Online (Sandbox Code Playgroud)

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

basename -a "${alpha[@]}"
Run Code Online (Sandbox Code Playgroud)

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

shuf -e "${alpha[@]}"
Run Code Online (Sandbox Code Playgroud)

  • "shuf"......"可能不会按顺序出来"......很有趣. (16认同)
  • 为shuf。谁会想到使用它? (2认同)

小智 7

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

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

这看起来简单而紧凑

  • 除了这在`my_array=("一二"三)`上中断 (13认同)