В zsh
, где основным синтаксисом для определения хэша является hash=(k1 v1 k2 v2...)
, как и в perl
(, более новые версии также поддерживают неудобный синтаксис ksh93/bash для совместимости, хотя и с вариациями, когда дело доходит до цитирования ключей)
keys=("${(@k)hash}")
values=("${(@v)hash}")
typeset -A reversed
reversed=("${(@)values:^keys}") # array zipping operator
или с помощью петли:
for k v ("${(@kv}hash}") reversed[$v]=$k
@
и двойные кавычки предназначены для сохранения пустых ключей и значений (обратите внимание, что bash
ассоциативные массивы не поддерживают пустые ключи ). Поскольку расширение элементов в ассоциативных массивах не имеет определенного порядка, если несколько элементов $hash
имеют одно и то же значение (, которое в конечном итоге станет ключом в $reversed
), вы не можете сказать, какой ключ будет использоваться. как значение в $reversed
.
Вы должны использовать флаг нижнего индекса хэша R
для получения элементов на основе значения вместо ключа, в сочетании с e
для точного соответствия (в отличие от подстановочного знака ), а затем получить ключи для этих элементов. элементы с флагом раскрытия параметра k
:
for value ("${(@u)hash}")
print -r "elements with '$value' as value: ${(@k)hash[(Re)$value]}"
zsh
(в отличие отksh93
)не поддерживает массивы массивов, но его переменные могут содержать байт NUL, поэтому вы можете использовать это для разделения элементов, если элементы иначе не содержат байты NUL, или использовать ${(q)var}
/ ${(Q)${(z)var}}
для кодирования/декодирования списка с использованием кавычек.
typeset -A seen
for k v ("${(@kv)hash}")
seen[$v]+=" ${(q)k}"
for k v ("${(@kv)seen}")
print -r "elements with '$k' as value: ${(Q@)${(z)v}}"
ksh93 была первой оболочкой, которая ввела ассоциативные массивы в 1993 году. Синтаксис присваивания значений в целом означает, что это очень сложно сделать программно, в отличие от zsh
, но, по крайней мере, в ksh93 это несколько оправдано тем, что ksh93
поддерживает сложные вложенные структуры данных.
В частности, здесь ksh93 поддерживает массивы как значения для хеш-элементов, так что вы можете сделать:
typeset -A seen
for k in "${!hash[@]}"; do
seen[${hash[$k]}]+=("$k")
done
for k in "${!seen[@]}"; do
print -r "elements with '$k' as value ${x[$k][@]}"
done
bash
десятилетия спустя добавили поддержку ассоциативных массивов, скопировали синтаксис ksh93, но не другие расширенные структуры данных,и не имеет каких-либо расширенных операторов расширения параметров zsh.
В bash
вы можете использовать цитируемый список , упомянутый в zsh, используя printf %q
или с более новыми версиями ${var@Q}
.
typeset -A seen
for k in "${!hash[@]}"; do
printf -v quoted_k %q "$k"
seen[${hash[$k]}]+=" $quoted_k"
done
for k in "${!seen[@]}"; do
eval "elements=(${seen[$k]})"
echo -E "elements with '$k' as value: ${elements[@]}"
done
Однако, как отмечалось ранее, ассоциативные массивы bash
не поддерживают пустое значение в качестве ключа, поэтому он не будет работать, если некоторые из значений $hash
пусты. Вы можете заменить пустую строку каким-нибудь заполнителем, например <EMPTY>
, или префиксом ключа с каким-нибудь символом, который вы позже удалите для отображения.
Я решил свой pb. путем обновления пакета pulseaudio-module-bluetooth
из Launchpad ppa :tigerite/bluez5 PPA:
$ wget -nv https://launchpad.net/~tigerite/+archive/ubuntu/bluez5/+files/pulseaudio-module-bluetooth_6.0-0ubuntu6ppa4_amd64.deb
2020-08-30 00:23:20 URL:https://launchpad.net/~tigerite/+archive/ubuntu/bluez5/+files/pulseaudio-module-bluetooth_6.0-0ubuntu6ppa4_amd64.deb [112370/112370] -> "pulseaudio-module-bluetooth_6.0-0ubuntu6ppa4_amd64.deb" [1]
$ sudo gdebi -n pulseaudio-module-bluetooth_6.0-0ubuntu6ppa4_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Building data structures... Done
Building data structures... Done
(Reading database... 588813 files and directories currently installed.)
Preparing to unpack pulseaudio-module-bluetooth_6.0-0ubuntu6ppa4_amd64.deb...
Unpacking pulseaudio-module-bluetooth (1:6.0-0ubuntu6ppa4) over (1:4.0-0ubuntu11)...
Setting up pulseaudio-module-bluetooth (1:6.0-0ubuntu6ppa4)...
$ pactl load-module module-bluetooth-discover
39
$ pactl list modules short | grep module-bluetooth
38 module-bluetooth-policy
39 module-bluetooth-discover
И теперь работает нормально:
$ bluetoothctl
[NEW] Controller 34:E6:AD:A1:9B:8A seb-C70D-B-311 [default]
[NEW] Device 00:13:09:01:19:61 M-260 BT
[bluetooth]# connect 00:13:09:01:19:61
Attempting to connect to 00:13:09:01:19:61
[CHG] Device 00:13:09:01:19:61 Connected: yes
Connection successful
[M-260 BT]#