Создание ассоциативного массива на основе другого ассоциативного массива

Я только что нашел одно решение:

  • Установите gconf-editor, если необходимо
  • Откройте gconf-editor ("ConfigurationEditor" в меню)
  • Откройте /apps/nm-applet в левой панели
  • В правой панели снимите галочку с disable-vpn-notifications (или других уведомлений)

Предположительно другие уведомления Gnome 3 похожи.

Надеюсь, кто-то знает более удобный способ сделать это.

1
24.08.2018, 14:54
2 ответа

Чтобы ответить на более общий вопрос о копировании ассоциативных массивов.

Сопровождающие bashприняли неудачное решение скопировать API ksh93, а не zsh, когда они представили свои собственные ассоциативные массивы в версии 4.0.

ksh93/ bashподдерживают установку ассоциативного массива в целом, но это с:

hash=([k1]=v1 [k2]=v2)

синтаксис. В то время как с zshэто

hash=(k1 v1 k2 v2)

(поддержка синтаксиса ([k]=v...)ksh93 также была добавлена ​​позже для совместимости ).

Однако это означает, что с ksh93 и bash очень сложно создать хеш таким образом из произвольного списка ключей и значений.

С синтаксисом zsh,вам просто нужно передать список как чередующиеся ключи и значения. Например, чтобы скопировать два ассоциативных массива:

h2=("${(@kv)h1}")

Или из CSV с двумя столбцами:

IFS=$'\n,'; h=($(<file.csv))

Или из массивов ключей и значений:

h=("${(@)keys:^values}")

С синтаксисом ksh93/ bash, хотя есть "${!h[@]}"и "${h[@]}"для расширения до списка ключей и значений (, таких как "${(@k)h}"и "${(@v)h}"в zsh), нет оператор для расширения до ключей и значений в синтаксисе [key]=value, ожидаемомh=(...)("${(@kv)h}"вzsh).

Уловка, которую вы можете использовать в этих оболочках для копирования ассоциативных массивов, хотя (помимо копирования элементов в цикле ), заключается в использовании вывода typeset -p.

Например, эквивалент zsh's h2=("${(@kv)h1}")для копирования h1в h2может быть выполнен в ksh93или bashс:

h1_definition=$(typeset -p h1) &&
  eval "typeset -A h2=${h1_definition#*=}"

Который с bashвы можете сократить до:

h1_definition=$(typeset -p h1) &&
  typeset -A h2="${h1_definition#*=}"

(Хотя, как и в ksh93, typeset -A h=valueявляется сокращением от typeset -A h=([0]=value)в bash, если valueначинается с (и заканчивается на ), то содержание интерпретируется как составное ассоциативное присвоение, как если бы передается в eval(, даже если (заключены в кавычки или являются результатом некоторого расширения )).

В конце концов, так же просто использовать цикл:

for k in "${!h1[@]}"; do h2[$k]=${h1[$k]}; done
7
27.01.2020, 23:12

это должно сделать это (также можно добавить дополнительный ключ -значение):

declare -A origDict=( [keya]=value_a [keyb]=value_b [keyc]=value_c )
declare -a newDict=( echo ${origDict[*]} [keynew]=new_value )
-3
06.05.2020, 23:26

Теги

Похожие вопросы