Damping dizisi için basit bir satır numarası
Boşluklarla bir değer ekledim:
foo=()
foo[12]="bar"
foo[42]="foo bar baz"
foo[35]="baz"
Ben, hızlıca dökmek için darbediziler veya ilişkisel diziler I kullanımı
Bu tek satırlık komut:
paste <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
Oluşturacak:
12 bar
35 baz
42 foo bar baz
Açıklaması
printf "%s\n" "${!foo[@]}"tüm tuşları yeni satırla ayrılmış olarak yazdıracak ,
printf "%s\n" "${foo[@]}"tüm değerleri bir satırsonu ile ayrılmış olarak yazdıracak ,
paste <(cmd1) <(cmd2)çıktı cmd1ve cmd2satır satır birleştirir .
tunning
Bu -danahtar ile ayarlanabilir:
paste -d : <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
12:bar
35:baz
42:foo bar baz
ya da:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[35]='baz'
foo[42]='foo bar baz'
İlişkilendirilebilir dizi aynı şekilde çalışır:
declare -A bar=([foo]=snoopy [bar]=nice [baz]=cool [foo bar]='Hello world!')
paste -d = <(printf "bar[%s]\n" "${!bar[@]}") <(printf '"%s"\n' "${bar[@]}")
bar[foo bar]="Hello world!"
bar[foo]="snoopy"
bar[bar]="nice"
bar[baz]="cool"
Yeni satırlarla veya özel karakterlerle ilgili sorun
Ne yazık ki, bunun artık çalışmamasını sağlayan en az bir koşul var: değişken newline içerdiğinde:
foo[17]=$'There is one\nnewline'
Komut pastesatır satır birleştirilir, böylece çıktı yanlış olur:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[17]='There is one
foo[35]=newline'
foo[42]='baz'
='foo bar baz'
Bu iş için, ikinci komut %qyerine (ve whipe quotes) kullanabilirsiniz:%sprintf
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "%q\n" "${foo[@]}")
Mükemmel hale getirecek:
foo[12]=bar
foo[17]=$'There is one\nnewline'
foo[35]=baz
foo[42]=foo\ bar\ baz
Gönderen man bash:
%q causes printf to output the corresponding argument in a
format that can be reused as shell input.
(a b c)Bir diziye dönüştürmek için bu şekilde sarın .