Bash 3 no tiene matrices asociativas, por lo que tendrá que usar algunas otras características de idioma para su propósito. Tenga en cuenta que incluso bajo bash 4, el código que escribió no hace lo que dice que hace: ./script.sh ${ARG}
no pasa la matriz asociativa a la secuencia de comandos secundaria, porque ${ARG}
se expande a nada cuando ARG
es una matriz asociativa. No puede pasar una matriz asociativa a un proceso hijo, necesita codificarlo de todos modos.
Debe definir algún protocolo para pasar argumentos entre el script principal y el script secundario. Uno común es pasar argumentos en el formulario key=value
. Esto supone que el carácter =
no aparece en las teclas.
También necesita averiguar cómo representar la matriz asociativa en la secuencia de comandos principal y en la secuencia de comandos secundaria. No necesitan usar la misma representación.
Un método común para representar una matriz asociativa es usar variables separadas para cada elemento, con un prefijo de denominación común. Esto requiere que el nombre de la clave solo conste de letras ASCII (en cualquier caso), dígitos y guiones bajos. Por ejemplo, en lugar de ${myarray[key]}
, escriba ${myarray__key}
. Si la tecla se determina en tiempo de ejecución, se necesita una ronda de expansión primero: en lugar de ${myarray[$key]}
, escribir
n=myarray__${key}; echo ${!n}
Para una asignación, uso printf -v
. Tenga en cuenta el formato %s
al printf
para usar el valor especificado. No escriba printf -v "myarray__${key}" %s "$value"
dado que eso trataría $value
como un formato y realizaría la expansión printf %
en él.
printf -v "myarray__${key}" %s "$value"
Si tiene que pasar un arreglo asociativo representado como este para un proceso hijo con la representación key=value
argumento, se puede utilizar para enumerar ${!myarray__*}
sobre todas las variables cuyo nombre comienza con myarray__
.
args=()
for k in ${!myarray__*}; do
n=$k
args+=("$k=${!n}")
done
En el proceso hijo, para convertir los argumentos de la forma key=value
para separar las variables con un prefijo:
for x; do
if [[ $x != *=* ]]; then echo 1>&2 "KEY=VALUE expected, but got $x"; exit 120; fi
printf -v "myarray__${x%%=*}" %s "${x#*=}"
done
Por cierto, ¿está seguro de que esto es lo que necesita? En lugar de llamar a un script bash desde otro script bash, es posible que desee ejecutar el script secundario en una subshell. De esta forma heredaría de todas las variables del padre.
Dado que bash 3 tiene matrices normales, solo tendrá que implementar matrices asociativas basadas en ellas. Pero en serio, ¿por qué sería eso necesario? –
Consulte [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). –