Interpolación variable en el caparazón

103

Tengo una variable llamada filepath=/tmp/name .

Para acceder a la variable, sé que puedo hacer esto: $filepath

En mi script de shell intenté hacer algo como esto (las comillas invertidas están destinadas)

`tail -1 $filepath_newstap.sh`

Esta línea falla, duuh !, porque la variable no se llama $filepath_newstap.sh

¿Cómo agrego _newstap.shel nombre de la variable?

Tenga en cuenta que las comillas inversas están destinadas a la evaluación de expresiones.

tawhid
fuente

Respuestas:

186

Utilizar

"$filepath"_newstap.sh

o

${filepath}_newstap.sh

o

$filepath\_newstap.sh

_es un carácter válido en identificadores. Dot no lo es, por lo que el shell intentó interpolar$filepath_newstap .

Puede usar set -upara hacer que el shell salga con un error cuando hace referencia a una variable indefinida.

choroba
fuente
7
Tal vez también mencione set -uqué hace que el script se anule si hace referencia a una variable indefinida.
tripleee
1
¿Cuál es la diferencia entre usar ${}y comillas dobles? ¿Debería preferir uno sobre el otro?
user31389
3
@ user31389: La diferencia es cuando la variable contiene espacios en blanco, entonces solo funcionan las comillas dobles.
choroba
@choroba ¿El nombre de las variables o el valor de la variable ?
Joshua Pinter
15

Use llaves alrededor del nombre de la variable:

`tail -1 ${filepath}_newstap.sh`

fuente
1
¿No necesitas comillas dobles?
michaelsnowden
@michaelsnowden No necesariamente. Para estar seguro, sí, pero la pregunta establecía explícitamente un camino sin espacios y sugirió además que el problema se $filepath_newstap.shestaba interpretando ${filepath_newstap}.shmás que como lo previsto ${filepath}_newstap.sh, lo que resolvería el problema.
@michaelsnowden Eso no me dice nada de lo que no esté al tanto. ¿Por qué cree que se requieren comillas dobles?
Porque estás intentando hacer una interpolación de cadenas y necesitas comillas dobles para eso
michaelsnowden
@michaelsnowden La expansión de parámetros ocurre entre comillas dobles o completamente fuera de las comillas. Las comillas simples o los caracteres de separación con comillas u otros caracteres no válidos en los identificadores son la única forma de evitar la expansión de parámetros. Por ejemplo, "$filepath"_fooy ${filepath}_fooambos se expandirían a /tmp/name_foo. Sin embargo, '$filepath'_foo, "$"filepath_foo, y $"filepath"_fooharía todo expansión evitar por completo. Es por eso que export PATH=$PATH:$addpathfunciona para agregar :$addpath(que estaría sujeto a la expansión de parámetros) a la PATHvariable de entorno.
3

En Bash:

tail -1 ${filepath}_newstap.sh
vyom
fuente