Interpolação variável no shell

103

Eu tenho uma variável chamada filepath=/tmp/name.

Para acessar a variável, sei que posso fazer o seguinte: $filepath

Em meu script de shell, tentei fazer algo assim (os acentos são intencionais)

`tail -1 $filepath_newstap.sh`

Esta linha falha, duuh !, porque a variável não é chamada $filepath_newstap.sh

Como faço _newstap.shpara anexar ao nome da variável?

Observe que os crases são destinados à avaliação da expressão.

tawheed
fonte

Respostas:

186

Usar

"$filepath"_newstap.sh

ou

${filepath}_newstap.sh

ou

$filepath\_newstap.sh

_é um caractere válido em identificadores. Dot não é, então o shell tentou interpolar $filepath_newstap.

Você pode usar set -upara fazer o shell sair com um erro ao fazer referência a uma variável indefinida.

choroba
fonte
7
Também pode mencionar o set -uque faz com que o script seja abortado se você referenciar uma variável indefinida.
tripleee
1
Qual é a diferença entre usar ${}e aspas duplas? Devo preferir um em vez do outro?
user31389
3
@ user31389: A diferença é quando a variável contém espaços em branco, então apenas as aspas duplas funcionam.
choroba
@choroba O nome da variável ou o valor da variável ?
Joshua Pinter
15

Use chaves ao redor do nome da variável:

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

fonte
1
Você não precisa de aspas duplas?
michaelsnowden,
@michaelsnowden Não necessariamente. Para ser seguro, sim, mas a pergunta indicava explicitamente um caminho sem espaços e sugeria ainda que o problema estava $filepath_newstap.shsendo interpretado como ${filepath_newstap}.she não como pretendido ${filepath}_newstap.sh, o que resolveria o problema.
@michaelsnowden Isso não me diz nada que eu já não saiba. Por que você acha que as aspas duplas são necessárias?
Porque você está tentando fazer interpolação de strings e precisa de aspas duplas para isso
michaelsnowden,
@michaelsnowden A expansão do parâmetro ocorre entre aspas duplas ou completamente fora das aspas. Aspas simples ou separar caracteres com aspas ou outros caracteres não válidos em identificadores são a única maneira de evitar a expansão do parâmetro. Por exemplo, "$filepath"_fooe ${filepath}_fooambos se expandem para /tmp/name_foo. No entanto, '$filepath'_foo, "$"filepath_foo, e $"filepath"_foofaria tudo de expansão evitar completamente. É por isso que export PATH=$PATH:$addpathfunciona para adicionar :$addpath(o que estaria sujeito à expansão de parâmetros) à PATHvariável de ambiente.
3

No Bash:

tail -1 ${filepath}_newstap.sh
Vyom
fonte