Estoy tratando de crear un diccionario de pares clave-valor usando el script Bash. Estoy tratando de usar esta lógica:
declare -d dictionary
defaults write "$dictionary" key -string "$value"
... donde $dictionaryes una variable, pero esto no funciona.
¿Hay alguna forma de crear pares clave-valor en el script Bash?

Respuestas:
En la versión 4 de bash se introdujeron matrices asociativas.
declare -A arr arr["key1"]=val1 arr+=( ["key2"]=val2 ["key3"]=val3 )La matriz arr ahora contiene los tres pares clave-valor. Sin embargo, Bash es bastante limitado en lo que puede hacer con ellos, sin clasificar o hacer estallar, etc.
for key in ${!arr[@]}; do echo ${key} ${arr[${key}]} doneRecorrerá todos los valores clave y los repetirá.
Nota: Bash 4 no viene con Mac OS X debido a su licencia GPLv3; tienes que descargarlo e instalarlo. Para más sobre eso, vea aquí
fuente
Si puede usar un delimitador simple, un delimitador muy simple es este:
for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; donePor la presente
iestá lleno de secuencias de caracteres como"a,b"y"c_s,d". cada uno separado por espacios. Después dedoque usamos la sustitución de parámetros para extraer la parte antes de la coma,y la parte posterior.fuente
bes una variable que contiene espacios?Para el almacenamiento persistente de clave / valor, puede usar
kv-bashuna implementación bash pura de la base de datos de clave / valor disponible en https://github.com/damphat/kv-bashUso
git clone https://github.com/damphat/kv-bash source kv-bash/kv-bashIntenta crear algunas variables permanentes
kvset myName xyz kvset myEmail [email protected] #read the varible kvget myEmail #you can also use in another script with $(kvget keyname) echo $(kvget myEmail)fuente
En bash, usamos
declare -A name_of_dictonary_variablepara que Bash entienda que es un diccionario.
Por ejemplo, si desea crear un
soundsdiccionario,declare -A sounds sounds[dog]="Bark" sounds[wolf]="Howl"dónde
dogywolfson"keys"yBarkyHowlson"values".Puede acceder a todos los valores usando:
echo ${sounds[@]}Oecho ${sounds[*]}Puede acceder a todas las claves solo usando:
echo ${!sounds[@]}Y si desea algún valor para una clave en particular, puede usar:
${sounds[dog]}esto le dará valor (
Bark) para clave (Dog).fuente
en bash anterior (o en
sh) que no es compatibledeclare -A, el siguiente estilo se puede usar para emular clave / valor# 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_imagefuente