Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Enhance @sh to output objects as bash associative array initialisers
Bash allows associative arrays to be initialised using declarations of the form name=([foo]=1 [bar]=42 [baz]="hello") At present, the @sh filter can format arrays into space-separated strings: $ ip -j addr | jq -c -r '.[] | {ifname, addr_info: .addr_info[]} | {ifname, family: .addr_info["family"], address: .addr_info["local"]} | [.[]] | @sh' | head -n 3 'lo' 'inet' '127.0.0.1' 'lo' 'inet6' '::1' 'eth0' 'inet' '93.93.131.233' We alter the @sh filter to output objects as well, in a format suitable for use as bash associative array initialisers: $ ip -j addr | jq -c -r '.[] | {ifname, addr_info: .addr_info[]} | {ifname, family: .addr_info["family"], address: .addr_info["local"]} | @sh' | head -n 3 [ifname]='lo' [family]='inet' [address]='127.0.0.1' [ifname]='lo' [family]='inet6' [address]='::1' [ifname]='eth0' [family]='inet' [address]='93.93.131.233' Allowing us to use symbolic names to reference values: $ ip -j addr | jq -c -r '.[] | {ifname, addr_info: .addr_info[]} | {ifname, family: .addr_info["family"], address: .addr_info["local"]} | @sh' | while read initialiser; do declare -A iface; eval iface=($initialiser); echo "Interface ${iface[ifname]} has ${iface[family]} address ${iface[address]}"; done | head -n 3 Interface lo has inet address 127.0.0.1 Interface lo has inet6 address ::1 Interface eth0 has inet address 93.93.131.233
- Loading branch information