Nombres de variables dinámicas en Bash
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 ${...}
.\$${...}
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. ...
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 bash
3), puede usar declare
para 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 .