[英]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..."
(其中c
是IFS
的第一个字符)。
你几乎总是想要"$@"
。 "${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.