Arrays 是否在Bash中的单独行上打印数组元素?
如何在单独的行上打印Bash数组的数组元素?这一个有效,但肯定有更好的方法:Arrays 是否在Bash中的单独行上打印数组元素?,arrays,bash,Arrays,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[@]}" $@和$*之间的区别: 未加引号,结果未指定。在
$ 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[*]}" )
sub-shell有助于在使用后恢复IFS我在一个巨大的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_列表中。用于:
利用历史;注意:如果您的值包含,则此操作将失败代码>:
history -p "${alpha[@]}"
使用basename;注意:如果您的值包含/
,则此操作将失败:
basename -a "${alpha[@]}"
使用shuf;请注意,结果可能不是按顺序出现的:
shuf -e "${alpha[@]}"
另一个有用的变体是管道到tr
:
echo“${my_array[@]}”|tr''\n'
这看起来简单紧凑我发现可以使用eval来避免使用子shell。因此:
IFS=$'\n' eval 'echo "${my_array[*]}"'
您可以使用bashc样式的For循环来执行您想要的操作
my_array=(one two three)
for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three
my_数组=(一二三)
对于((i=0;i<${my#u数组[@]};i++);执行回显“${my_数组[$i]}”;完成
一
二
三
请注意,如果要确保带有内部空格的元素不会被意外拆分,则变量引用周围的双引号非常重要。@sputnick:不起作用,数组元素以单行结尾。命令后面的两个连字符用于什么?我在手册中找不到对它的任何引用。是否有一种方法可以使它在数组中没有元素时不输出空行,而不必|grep-v'^$'
?@espaciomore“%s\n”是printf函数的输出格式。%s表示字符串参数(在本例中为数组元素)的占位符,\n并在其后添加换行符。因此,数组中每个元素的输出都会有一个字符串和一个换行符。对不起,perreal,我将复选标记移到了sputnick,尽管我更喜欢您的解决方案,只是因为我了解了“printf”函数。感谢您的回答-我喜欢它!扩展后会发生太糟糕的赋值,因此IFS=$'\n'echo“${my_array[*]}”
不起作用。哦,好吧@cxw,你说的“分配发生”是什么意思?@bschlueter,我试过bash4-4.4.23(1)版本,它很有效@cxw啊,我不知道你在那里想做什么。我认为它不起作用,因为echo
是Bash中内置的。但是,您可以将其封装在函数中,它将工作!看起来不像一个完整的例子。“嘘”。。。“可能不会按顺序出现”。。。好笑,谢谢你。谁会想到使用它呢?除了在my_array=(“一两”三)上中断之外,
用双引号修复了它。没有像Bash版本4
+上宣传的那样工作,不得不使用echo“${my_array[@]}”\tr'\n'
,尽管我个人会避免这样使用echo
,其中tr
我的选择我认为类似于tr'''\n'永远不要使用邪恶的评估
my_array=(one two three)
for ((i=0; i < ${#my_array[@]}; i++ )); do echo "${my_array[$i]}"; done
one
two
three