在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
445745 次浏览

试着这样做:

$ printf '%s\n' "${my_array[@]}"

$@$*的区别:

  • 不加引号,表示结果不指定。在Bash中,两者都扩展为单独的参数 然后wordsplit和globbed.

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

你几乎总是需要"$@""${arr[@]}"也是一样。

总是引用它们!

只需引用回显的参数:

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

子壳有助于恢复IFS使用后

我试着在一个巨大的…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.

使用:

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'

这看起来简单而紧凑

我发现你可以使用eval来避免使用subshell。因此:

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

你可以使用Bash C Style For循环来做你想做的事情。

my_array=(one two three)


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