向除最后一个之外的所有 bash 数组项添加尾随换行符



我有一个名为"array"的数组,其中包含五个动物名称。我想在每个数组项目之后有两个换行符 (\) 期望最后一个。下面的脚本完全符合我的需求:

[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 '%sn' "${array[$i]/%/$'nn'}"
done
for i in $ultimate_array_item; do
    printf '%sn' "${array[$i]}"
done
[user@T60 ~]$ ./scriptfile.sh 
cat

dog

elefant

zebra

hippo
[user@T60 ~]$ 

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

你可以这样写:

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

笔记:

  • 如果您提供的参数多于格式字符串引用的参数printf那么它只会一遍又一遍地重新处理格式字符串,直到用完所有参数。因此,上面的printf打印每个数组元素,后跟两个换行符。
  • 命令替换"$(...)" 剥离所有尾随换行符,即使它保留其他空格不变。

结合@glenn杰克曼关于在每个元素之前打印两个换行符的见解,除了第一个元素之外,具有 Bash 的数组切片功能:

printf "%sn" "${array[0]}"
printf "nn%sn" "${array[@]:1}"

(请注意,如果数组只有一个元素,这将不起作用。

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

prefix=""
for element in "${array[@]}"; do
    printf "%s%sn" "$prefix" "$element"
    prefix=$'nn'
done

相关内容

  • 没有找到相关文章

最新更新