ง่าย ๆหนึ่งบรรทัดเคล็ดลับสำหรับการทิ้งอาร์เรย์
ฉันได้เพิ่มหนึ่งค่าด้วยช่องว่าง:
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
ละบรรทัด
tunning
สิ่งนี้สามารถปรับได้โดย-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)
แปลงเป็นอาเรย์