0

5 つの動物の名前を含む「配列」という配列があります。各配列項目が最後のものを期待した後、2 つの改行 (\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[@]}")"

ノート:

  • format-string が参照するprintfよりも多くの引数を指定すると、すべての引数を使い果たすまで、format-string が何度も再処理されます。したがって、上記printfは各配列要素に続いて2つの改行を出力します。
  • コマンド置換 ,"$(...)"は、他の空白をそのまま残しても、末尾の改行をすべて取り除きます。
于 2012-11-17T02:25:17.670 に答える
2

最初の改行を除く各要素の前に2つの改行を出力することに関する@glenn jackmanの洞察を、bashの配列スライス機能と組み合わせます。

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

(配列に要素が 1 つしかない場合、これは正しく機能しないことに注意してください。)

于 2012-11-17T07:27:43.617 に答える
1

あなたの質問の言い回しは異なります:「最初の要素を除く各要素の前に2つの改行を印刷したい」。

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