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中,两者都扩展为分开的参数,然后是分词和globbed。
-
引用
"$@"
作为单独的参数扩展每个元素,而"$*"
扩展为合并到一个参数"$1c$2c..."
(其中c
是IFS
的第一个字符)的参数。
你几乎总是想要"$@"
。 "${arr[@]}"
。
总是引用他们!
只要引用参数echo:
( IFS=$'\n'; echo "${my_array[*]}" )
子shell有助于在使用后恢复IFS
用于 :
for each in "${alpha[@]}" do echo "$each" done
使用历史 ; 注意如果你的值包含,这将失败!
:
history -p "${alpha[@]}"
使用基本名称 ; 注意如果你的值包含/
这将失败
basename -a "${alpha[@]}"
使用shuf ; 注意结果可能不会按顺序出现:
shuf -e "${alpha[@]}"
我试图在这个巨人的答案…如果循环,但没有得到任何喜悦 – 所以我这样做,也许是凌乱的,但做了这个工作:
# 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中。
另一个有用的变体是pipe to tr
:
echo ${my_array[@]} | tr " " "\n"
这看起来简单而紧凑