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 $dictionary
es 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}]} done
Recorrerá 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; done
Por la presente
i
está lleno de secuencias de caracteres como"a,b"
y"c_s,d"
. cada uno separado por espacios. Después dedo
que usamos la sustitución de parámetros para extraer la parte antes de la coma,
y la parte posterior.fuente
b
es una variable que contiene espacios?Para el almacenamiento persistente de clave / valor, puede usar
kv-bash
una 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-bash
Intenta 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_variable
para que Bash entienda que es un diccionario.
Por ejemplo, si desea crear un
sounds
diccionario,declare -A sounds sounds[dog]="Bark" sounds[wolf]="Howl"
dónde
dog
ywolf
son"keys"
yBark
yHowl
son"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_image
fuente