转储数组的简单一招
我用空格添加了一个值:
foo=()
foo[12]="bar"
foo[42]="foo bar baz"
foo[35]="baz"
我,为了快速转储 重击我使用的数组或关联数组
这一行命令:
paste <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
将呈现:
12 bar
35 baz
42 foo bar baz
解释
printf "%s\n" "${!foo[@]}"
将打印所有用换行符分隔的键,
printf "%s\n" "${foo[@]}"
将打印所有用换行符分隔的值,
paste <(cmd1) <(cmd2)
将逐行合并cmd1
和的输出cmd2
。
调音
这可以通过-d
开关进行调整:
paste -d : <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
12:bar
35:baz
42:foo bar baz
甚至:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[35]='baz'
foo[42]='foo bar baz'
关联数组的工作原理相同:
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"
问题与换行符或特殊字符
不幸的是,至少有一种条件使其不再起作用:当变量确实包含换行符时:
foo[17]=$'There is one\nnewline'
命令paste
将逐行合并,因此输出将变为错误:
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'
对于这项工作,您可以在第二个命令(和鞭打引号)中使用%q
而不是:%s
printf
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "%q\n" "${foo[@]}")
将呈现完美:
foo[12]=bar
foo[17]=$'There is one\nnewline'
foo[35]=baz
foo[42]=foo\ bar\ baz
来自man bash
:
%q causes printf to output the corresponding argument in a
format that can be reused as shell input.
(a b c)
以将其转换为数组。