如何在单独的行上打印 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,然后是 wordsplit 和 globbed。
引用,"$@"
将每个元素扩展为一个单独的参数,同时"$*"
扩展为合并为一个参数的 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 -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
虽然这在列表中添加了一个空格,但这很好 - 我希望它缩进一点。还假设“\n”可以打印在原始 $EP_LIST 中。
你可以使用 Bash C Style For Loop 来做你想做的事。
my_array=(one two three)
for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three
我发现您可以使用 eval 来避免使用子外壳。因此:
IFS=$'\n' eval 'echo "${my_array[*]}"'