Чи є спосіб створити пари ключ-значення у сценарії Bash?


82

Я намагаюся створити словник пари значень ключа за допомогою сценарію Bash. Я намагаюся використовувати цю логіку:

declare -d dictionary
defaults write "$dictionary" key -string "$value"

... де $dictionaryє змінна, але це не працює.

Чи є спосіб створити пари ключ-значення у сценарії Bash?


я працював на bash. Придумав спосіб зробити це сам.
RKS

використання цієї також довідки: urls + = ('<dict> <key> key1 </key> <string>' $ value1 '</string> <key> key2 </key> <string>' $ value2 '</ string > <key> key3 </key> <string> '$ value3' </string> </dict> '
RKS

3
Чудово! Вам дозволяється (і навіть заохочується) відповідати на власні запитання щодо StackOverflow, таким чином ви допоможете іншим у подібній ситуації.
Johnsyweb

Я підтримую вашу відповідь, якщо ви включите деякі зразки використання та результатів. Удачі.
обстріл

Відповіді:


154

У версії bash було введено 4 асоціативні масиви.

declare -A arr

arr["key1"]=val1

arr+=( ["key2"]=val2 ["key3"]=val3 )

Масив arr тепер містить три пари значень ключа. Bash досить обмежений, що ви можете з ними робити, не сортуючи, не вискакуючи тощо.

for key in ${!arr[@]}; do
    echo ${key} ${arr[${key}]}
done

Буде циклічно перемикати всі ключові значення та повторювати їх.

Примітка: Bash 4 не постачається з Mac OS X через ліцензію GPLv3; вам потрібно завантажити та встановити його. Більше про це дивіться тут


25
Важливо зазначити, що Bash 4 не постачається з Mac OS X через ліцензію GPLv3; вам потрібно завантажити та встановити його. (Apple все ще постачає Bash 3.2.)
Будь ласка, затримайтеся

5
Тут є мінус: ітерація не впорядковується за порядком вставки.
AlikElzin-kilaka

безумовно потрібна bash версія 4. В іншому випадку оголосити -A не працює. Mac поставляється з Башем 3.2
мамуна

2
Це не через ліцензію GPLv3, а тому, що Apple не хоче використовувати ліцензоване програмне забезпечення GPLv3. Отже, це нічого поганого в ліцензії GPLv3, а в Apple щось, я гадаю.
Tech Nomad

32

Якщо ви можете використовувати простий роздільник, дуже простий однолінійний такий:

for i in a,b c_s,d ; do 
  KEY=${i%,*};
  VAL=${i#*,};
  echo $KEY" XX "$VAL;
done

Цим iзаповнюється послідовність символів, таких як "a,b"і "c_s,d". кожен розділений пробілами. Після doми використовуємо заміну параметрів для вилучення частини перед комою ,та частини після неї.


Чи можете ви пояснити приклад, який ви дали?
AlikElzin-kilaka

Питання: Чи спрацює це, якщо bзмінна містить пробіли?
AlikElzin-kilaka

у моєму прикладі b не є змінною, і ні, це не буде працювати, оскільки список для циклу for розділений пробілами.
математика

2

Для постійного зберігання ключів / значень ви можете використовувати kv-bashчисту реалізацію бази даних бази даних ключ / значення, доступну за адресою https://github.com/damphat/kv-bash

Використання

git clone https://github.com/damphat/kv-bash
source kv-bash/kv-bash

Спробуйте створити кілька постійних змінних

kvset myName  xyz
kvset myEmail xyz@example.com

#read the varible
kvget myEmail

#you can also use in another script with $(kvget keyname)
echo $(kvget myEmail)

2

В bash ми використовуємо

declare -A name_of_dictonary_variable

так що Баш розуміє, що це словник.

Наприклад, наприклад, ви хочете створити soundsсловник,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

де dogі wolfє "keys", і Barkі Howlє "values".

Ви можете отримати доступ до всіх значень, використовуючи: echo ${sounds[@]}АБОecho ${sounds[*]}

Ви можете отримати доступ до всіх клавіш лише за допомогою: echo ${!sounds[@]}

І якщо вам потрібне будь-яке значення для певного ключа, ви можете використовувати:

${sounds[dog]}

це дасть вам значення ( Bark) для ключа ( Dog).


0

у старішому bash (або in sh), який не підтримує declare -A, наступний стиль можна використовувати для емуляції ключа / значення

# key
env=staging


# values
image_dev=gcr.io/abc/dev
image_staging=gcr.io/abc/stage
image_production=gcr.io/abc/stable

img_var_name=image_$env

# active_image=${!var_name}
active_image=$(eval "echo \$$img_var_name")

echo $active_image
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.