Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 是否在Bash中的单独行上打印数组元素?_Arrays_Bash - Fatal编程技术网

Arrays 是否在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[@]}" $@和$*之间的区别: 未加引号,结果未指定。在

如何在单独的行上打印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中,两者都扩展为单独的参数 然后是单词拆分和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