hay una solución 1 línea a la pregunta original de la OP, el nombre base de un guión con el archivo despojado de extensión:
progname=$(tmp=${0%.*} ; echo ${tmp##*/})
Aquí hay otro, sino que, utilizando una trampa de nombre base:
progname=$(basename ${0%.*})
Otras respuestas han desviado de la pregunta original del OP y centrado en si es posible ampliar simplemente el resultado de expresiones con ${!var}
pero se encontró con la limitación de que var
deben coincidir explícitamente un nombre de variable.Una vez dicho esto, no hay nada que le impida tener una respuesta de 1 línea si encadena las expresiones junto con un punto y coma.
ANIMAL=CAT
BABYCAT=KITTEN
tmp=BABY${ANIMAL} ; ANSWER=${!tmp} # ANSWER=KITTEN
Si usted quiere hacer este aparece como un solo estado, puede anidar en un subnivel, es decir
ANSWER=$(tmp=BABY${ANIMAL) ; echo ${!tmp}) # ANSWER=KITTEN
Un uso interesante es obra de indirección en argumentos de una función bash. A continuación, puede anidar la función de su fiesta insta a lograr indirecta anidada multinivel porque se nos permite hacer comandos anidados:
Esto es una demostración de indirección de una expresión:
deref() { echo ${!1} ; }
ANIMAL=CAT
BABYCAT=KITTEN
deref BABY${ANIMAL} # Outputs: KITTEN
Esto es una demostración de indirección multinivel a través de comandos anidados:
deref() { echo ${!1} ; }
export AA=BB
export BB=CC
export CC=Hiya
deref AA # Outputs: BB
deref $(deref AA) # Outputs: CC
deref $(deref $(deref AA)) # Outputs: Hiya
+1 para la referencia de la base de datos. –
Sin embargo, si usa índices, pueden ser correctos. por ejemplo, 'ARR = ('foo' 'bar' 'falso'); i = 0; while/bin/true; hacer eco $ {ARR [$ i]}; i = (((i + 1)% 3)); done' que obviamente es inútil como código, pero funciona como un ejemplo. –
En realidad, este * es * compatible en ciertos casos, al menos en 'bash' y' ksh'. Esto funciona: 'x = yyy; y = xxxyyy; echo $ {y% $ {x}} '. Creo que lo importante es que la expansión anidada es un argumento de uno de los operadores. Sin embargo, no he visto que esté documentado realmente bien. – twalberg