繁体   English   中英

在 Bash 中的单独行上打印数组元素?

[英]Print array elements on separate lines in 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 中,两者都扩展为单独的 args,然后进行分词和全局化。

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

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

总是引用它们!

只需引用 echo 的参数:

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

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

用于

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

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

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

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

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

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

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

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

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

这看起来简单而紧凑

我在一个巨大的 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”。

您可以使用 Bash C 样式 For 循环来执行您想要的操作。

my_array=(one two three)

for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three

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

IFS=$'\n' eval 'echo "${my_array[*]}"'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM