如何在单独的行上打印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
如何在单独的行上打印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中,两者都扩展为单独的参数 然后是wordsplit和globbed。 引号括起来,"$@"将每个元素作为单独的参数展开,而"$*" 扩展到合并为一个参数的参数:"$1c$2c…"(其中c为 IFS的第一个字符)。
你几乎总是想要“$@”。“${arr[@]}”也是如此。
总是引用它们!
其他回答
我试着在一个巨大的…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
虽然这给列表增加了一个空格,这是好的-我想让它缩进一点。 还假定“\n”可以打印在原始的$EP_LIST中。
只需引用回显的参数:
( IFS=$'\n'; echo "${my_array[*]}" )
子壳有助于恢复IFS使用后
使用:
for each in "${alpha[@]}"
do
echo "$each"
done
使用历史;注意,如果你的值包含!
history -p "${alpha[@]}"
使用:;注意,如果你的值包含/,这将失败:
basename -a "${alpha[@]}"
使用shuf;注意,结果可能不是按顺序显示的:
shuf -e "${alpha[@]}"
我发现你可以使用eval来避免使用subshell。因此:
IFS=$'\n' eval 'echo "${my_array[*]}"'
试着这样做:
$ printf '%s\n' "${my_array[@]}"
$@和$*的区别:
没有引用,结果没有说明。在Bash中,两者都扩展为单独的参数 然后是wordsplit和globbed。 引号括起来,"$@"将每个元素作为单独的参数展开,而"$*" 扩展到合并为一个参数的参数:"$1c$2c…"(其中c为 IFS的第一个字符)。
你几乎总是想要“$@”。“${arr[@]}”也是如此。
总是引用它们!