我有一个名为"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