Tengo dos matrices:
arrayA=(1 2 3)
arrayB=(a b c)
y quiero imprimir uno de ellos usando un argumento de línea de comando, es decir, sin ninguno if else
.
Intenté algunas variaciones en la sintaxis sin éxito. Quiero hacer algo como esto:
ARG="$1"
echo ${array${ARG}[@]}
pero recibo un error de "mala sustitución". ¿Cómo puedo conseguir esto?
Respuestas:
Intenta hacer esto:
NOTA
man bash
(expansión de parámetros):fuente
!
haciendo exactamente delante de lavar
variable? ¿Cómo funciona eso? Parecía ser la sustitución de la historia en Google, pero no podía ver cómo funcionaba aquí.Si bien puede usar el acceso indirecto como se señala en otra respuesta , otra forma (en ksh y Bash 4.3 y posteriores) sería usar namerefs. Especialmente en el caso de las matrices, esto puede ser más útil, ya que puede indexar la matriz a través de nameref y no necesita colocar el índice en la variable utilizada como referencia.
Esto no funciona a través del acceso indirecto:
Como podría decir un programador en C,
${!q[1]}
aquí actúa como siq
fuera una matriz de punteros, en lugar de ser un puntero a una matriz.fuente
nota: escap cotes en caso de espacio !
fuente
Esto requirió mucha prueba y error, pero finalmente funcionó.
Tomé un poco de inspiración de Youness. Pero todas las otras respuestas no ayudaron en mi viejo bash (suse11sp1 [3.2.51 (1) -release])
El bucle 'for' se negó a expandir la matriz indirecta, en su lugar, debe expandirla previamente, usarla para crear otra matriz con su nuevo nombre de variable. Mi ejemplo a continuación muestra un doble bucle, ya que ese es mi uso previsto.
Estoy usando # para eliminar el "Nuevo_" de la primera entrada de la matriz, luego concatenando con "cosas", para obtener "FOOthings". \ $ {} con echo y eval, luego haga lo suyo en orden sin arrojar errores, que se envuelve en un nuevo $ () y se le asigna el nuevo nombre de la variable.
ACTUALIZACIÓN ##### 2018/06/07Recientemente descubrí un giro más sobre este tema. La variable creada no es en realidad una matriz, sino una cadena delimitada por espacios. Para la tarea anterior, esto estaba bien, debido a cómo funciona "for", no lee la matriz, se expande y luego se repite, vea el extracto a continuación:
Pero, luego necesitaba usarlo como una matriz. Para esto necesitaba realizar un paso más. Tomé el código literalmente por Dennis Williamson . Lo he probado y funciona bien.
El "IFS = ','" es una variable que contiene su deliminador. "leer" con "-a" corta y retroalimenta la picadura en la variable de matriz. Tenga en cuenta que esto no respeta las comillas, pero hay algunas opciones en lectura para administrar esto, por ejemplo, he eliminado el indicador -r que no necesitaba. Así que ahora he combinado esta adición en la creación de variables, lo que permite que los datos sean tratados y tratados como deberían.
fuente
de ninguna manera :(
si sus matrices son así de simples, entonces use matrices asociativas
desafortunadamente, si sus arreglos son más complicados (por ejemplo
array=( "a b" c )
), eso no funcionaría. Luego, debe pensar más en otra forma de alcanzar su objetivo.fuente
Utilizar
eval
fuente
Así es como crearía una variable con nombre dinámico (versión bash <4.3).
A continuación se muestra un grupo de funciones que se pueden usar para administrar matrices con nombres dinámicos (versión bash <4.3).
A continuación se muestra un grupo de funciones que se pueden usar para administrar matrices con nombres dinámicos (versión bash> = 4.3).
Para obtener más detalles sobre estos ejemplos, visite Getting Bashed by Dynamic Arrays de Ludvik Jerabek
fuente