Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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,我有一个名为“array”的数组,其中包含五个动物名称。我希望在每个数组项后面有两个换行符(\n\n),最后一个除外。下面的脚本正是我想要的: [user@T60 ~]$ cat scriptfile.sh #!/usr/bin/env bash array=( cat dog elefant zebra hippo ) number_of_items_in_array=${#array[@]} penultimate_array_item=$(( $number_of_items_in

我有一个名为“array”的数组,其中包含五个动物名称。我希望在每个数组项后面有两个换行符(\n\n),最后一个除外。下面的脚本正是我想要的:

[user@T60 ~]$ cat scriptfile.sh 
#!/usr/bin/env bash

array=( cat dog elefant zebra hippo )

number_of_items_in_array=${#array[@]}

penultimate_array_item=$(( $number_of_items_in_array - 2 ))

ultimate_array_item=$(( $number_of_items_in_array - 1 ))

for i in $(seq 0 $penultimate_array_item); do
    printf '%s\n' "${array[$i]/%/$'\n\n'}"
done

for i in $ultimate_array_item; do
    printf '%s\n' "${array[$i]}"
done

[user@T60 ~]$ ./scriptfile.sh 
cat


dog


elefant


zebra


hippo
[user@T60 ~]$ 
然而,我觉得它有点笨重。有更优雅、更简约的解决方案吗?

你可以写:

array=( cat dog elefant zebra hippo )
echo "$(printf '%s\n\n\n' "${array[@]}")"
注:

  • 如果给
    printf
    的参数比格式字符串引用的参数多,那么它只需反复重新处理格式字符串,直到用完所有参数。因此,上面的
    printf
    打印每个数组元素,后跟两个换行符
  • 命令替换,
    “$(…)”
    ,除去所有尾随的换行符,即使它保留了其他空白

你的问题措辞不同:“我想在每个元素之前打印两行新行,第一行除外。”


结合@glenn jackman关于在每个元素之前打印两条换行线(第一条除外)的见解和bash的阵列切片功能:

printf "%s\n" "${array[0]}"
printf "\n\n%s\n" "${array[@]:1}"
(请注意,如果数组只有一个元素,则此操作将无法正常工作。)

printf "%s\n" "${array[0]}"
printf "\n\n%s\n" "${array[@]:1}"