0

我有一个名为“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 ~]$ 

但是,我觉得它有点笨拙。有没有更优雅、更简约的解决方案?

4

3 回答 3

6

你可以写:

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

笔记:

  • 如果您提供printf的参数多于格式字符串所指的参数,那么它只会一遍又一遍地重新处理格式字符串,直到用完所有参数。所以上面printf打印了每个数组元素,后跟两个换行符。
  • 命令替换,"$(...)"去掉所有尾随的换行符,即使它保留其他空白不变。
于 2012-11-17T02:25:17.670 回答
2

将@glenn jackman 关于在除第一个元素之外的每个元素之前打印两个换行符的见解与 bash 的数组切片功能相结合:

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

(请注意,如果数组只有一个元素,这将无法正常工作。)

于 2012-11-17T07:27:43.617 回答
1

您的问题措辞不同:“我想在除一个元素之外的每个元素之前打印两个换行符。”

prefix=""
for element in "${array[@]}"; do
    printf "%s%s\n" "$prefix" "$element"
    prefix=$'\n\n'
done
于 2012-11-17T03:05:24.617 回答