Interpolation variable dans le shell

103

J'ai une variable appelée filepath=/tmp/name.

Pour accéder à la variable, je sais que je peux faire ceci: $filepath

Dans mon script shell, j'ai essayé de faire quelque chose comme ça (les backticks sont destinés)

`tail -1 $filepath_newstap.sh`

Cette ligne échoue, duuh !, car la variable n'est pas appelée $filepath_newstap.sh

Comment ajouter _newstap.shau nom de la variable?

Veuillez noter que les backticks sont destinés à l'évaluation de l'expression.

tawhid
la source

Réponses:

187

Utilisation

"$filepath"_newstap.sh

ou

${filepath}_newstap.sh

ou

$filepath\_newstap.sh

_est un caractère valide dans les identificateurs. Le point n'est pas, donc le shell a essayé d'interpoler $filepath_newstap.

Vous pouvez utiliser set -upour que le shell se ferme avec une erreur lorsque vous référencez une variable non définie.

choroba
la source
7
Peut-être également mentionner set -uce qui provoque l'abandon du script si vous référencez une variable non définie.
tripleee
1
Quelle est la différence entre utiliser ${}et guillemets doubles? Dois-je préférer l'un à l'autre?
user31389
3
@ user31389: La différence est que lorsque la variable contient des espaces, alors seuls les guillemets doubles fonctionnent.
choroba
@choroba Le nom des variables ou la valeur de la variable ?
Joshua Pinter le
15

Utilisez des accolades autour du nom de la variable:

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

la source
1
N'avez-vous pas besoin de guillemets doubles?
michaelsnowden
@michaelsnowden Pas nécessairement. Pour être sûr, oui, mais la question énonçait explicitement un chemin sans espaces et suggérait en outre que le problème était $filepath_newstap.shinterprété ${filepath_newstap}.shplutôt que comme prévu ${filepath}_newstap.sh, ce qui résoudrait le problème.
@michaelsnowden Cela ne me dit rien dont je ne sois pas déjà au courant. Pourquoi pensez-vous que les guillemets doubles sont nécessaires?
Parce que vous essayez de faire une interpolation de chaîne et que vous avez besoin de guillemets doubles pour cela
michaelsnowden
@michaelsnowden L'expansion des paramètres se produit soit entre guillemets, soit complètement en dehors des guillemets. Les guillemets simples ou les caractères de séparation avec des guillemets ou d'autres caractères non valides dans les identificateurs sont le seul moyen d'empêcher l'expansion des paramètres. Par exemple, "$filepath"_fooet ${filepath}_foos'étendraient tous deux à /tmp/name_foo. Cependant, '$filepath'_foo, "$"filepath_fooet $"filepath"_fooserait tout éviter une expansion complètement. C'est pourquoi export PATH=$PATH:$addpathtravaille à ajouter :$addpath(qui serait soumis à l'expansion des paramètres) à la PATHvariable d'environnement.
3

Dans Bash:

tail -1 ${filepath}_newstap.sh
vyom
la source