如何在单独的行上打印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[@]}"
$@
和$*
之间的区别:
"$@"
扩展每个元素作为一个单独的参数,而"$*"
扩展到args合并为一个参数:"$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;请注意,如果您的值包含/
,则会失败:
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中。
另一个有用的变体是管道到tr
:
echo "${my_array[@]}" | tr ' ' '\n'
这看起来简单而紧凑