Nombres de variables dinámicas en Bash

Resuelto Konstantinos asked hace 11 años • 20 respuestas

Estoy confundido acerca de un script bash.

Tengo el siguiente código:

function grep_search() {
    magic_way_to_define_magic_variable_$1=`ls | tail -1`
    echo $magic_variable_$1
}

Quiero poder crear un nombre de variable que contenga el primer argumento del comando y que tenga el valor de, por ejemplo, la última línea dels .

Entonces, para ilustrar lo que quiero:

$ ls | tail -1
stack-overflow.txt

$ grep_search() open_box
stack-overflow.txt

Entonces, ¿cómo debo definir/declarar$magic_way_to_define_magic_variable_$1 y cómo debo llamarlo dentro del script?

Lo he intentado eval, pero todavía estoy confundido ${...}.\$${...}

Konstantinos avatar May 15 '13 04:05 Konstantinos
Aceptado

He estado buscando una mejor manera de hacerlo recientemente. La matriz asociativa me pareció excesiva. Mira lo que he encontrado:

suffix=bzz
declare prefix_$suffix=mystr

...y luego...

varname=prefix_$suffix
echo ${!varname}

De los documentos :

El carácter '$' introduce la expansión de parámetros, la sustitución de comandos o la expansión aritmética. ...

La forma básica de expansión de parámetros es ${parameter}. Se sustituye el valor del parámetro. ...

Si el primer carácter del parámetro es un signo de exclamación (!) y el parámetro no es un nameref, introduce un nivel de direccionamiento indirecto. Bash usa el valor formado al expandir el resto del parámetro como nuevo parámetro; luego se expande y ese valor se usa en el resto de la expansión, en lugar de la expansión del parámetro original. Esto se conoce como expansión indirecta. El valor está sujeto a expansión de tilde, expansión de parámetros, sustitución de comandos y expansión aritmética. ...

Yorik.sar avatar Aug 08 '2013 11:08 Yorik.sar

Utilice una matriz asociativa, con nombres de comandos como claves.

# Requires bash 4, though
declare -A magic_variable=()

function grep_search() {
    magic_variable[$1]=$( ls | tail -1 )
    echo ${magic_variable[$1]}
}

Si no puede usar matrices asociativas (por ejemplo, debe admitir bash3), puede usar declarepara crear nombres de variables dinámicas:

declare "magic_variable_$1=$(ls | tail -1)"

y utilice la expansión de parámetros indirecta para acceder al valor.

var="magic_variable_$1"
echo "${!var}"

Consulte BashFAQ: Indirección: evaluación de variables indirectas/de referencia .

chepner avatar May 14 '2013 21:05 chepner