Semplice trucco di una riga per il dumping array
Ho aggiunto un valore con spazi:
foo=()
foo[12]="bar"
foo[42]="foo bar baz"
foo[35]="baz"
Io, per discarica rapida bashmatrici o matrici associative che uso
Questo comando a una riga:
paste <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
Renderà:
12 bar
35 baz
42 foo bar baz
spiegato
printf "%s\n" "${!foo[@]}"stamperà tutte le chiavi separate da una nuova riga ,
printf "%s\n" "${foo[@]}"stamperà tutti i valori separati da una nuova riga ,
paste <(cmd1) <(cmd2)unirà l'output di cmd1e cmd2riga per riga.
tunning
Questo potrebbe essere regolato -ddall'interruttore:
paste -d : <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
12:bar
35:baz
42:foo bar baz
o anche:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[35]='baz'
foo[42]='foo bar baz'
La matrice associativa funzionerà allo stesso modo:
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"
Emettere con newline o caratteri speciali
Sfortunatamente, c'è almeno una condizione che rende questo non più funzionante: quando la variabile contiene newline:
foo[17]=$'There is one\nnewline'
Il comando pasteunirà riga per riga, quindi l'output risulterà errato:
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'
Per questo lavoro, è possibile utilizzare %qinvece %snel secondo printfcomando (e whipe quoting):
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "%q\n" "${foo[@]}")
Renderà perfetto:
foo[12]=bar
foo[17]=$'There is one\nnewline'
foo[35]=baz
foo[42]=foo\ bar\ baz
Da man bash:
%q causes printf to output the corresponding argument in a
format that can be reused as shell input.
(a b c)per convertirlo in un array.