Je suis relativement nouveau dans les scripts shell, mais j'ai presque terminé un script qui utilise le programme lftp . La partie du script qui me pose problème est lorsque je crée une longue chaîne de commandes (séparées par ;
).
for var in something
do
...
commands_to_run+="echo Result is `tail -n 1 $somefile`;"
done
Ce que je remarque, c'est que le tail
programme - enveloppé dans les backticks - est exécuté lorsque la boucle for est en cours d'itération, mais pas lorsque j'appelle la chaîne de commandes plus tard dans mon script.
Malheureusement, le contenu de $ somefile n'est pas à ce stade prêt à être inspecté. Comment puis-je obtenir l'exécution de la commande lorsque j'en ai besoin, et non pendant que je crée la chaîne?
la source
$(...)
comme Hauke l'a suggéré mais la barre oblique inverse est la clé.eval
car vous pouvez faire la même chose en n'échappant pas à la$
et en utilisant des guillemets simples ('
) plutôt que des guillemets doubles ("
) pour entourer votre commande.echo
une chaîne avec un contenu incluant la sortie d'une commande imbriquée à exécution différée.echo
ne fonctionnera pas car il n'y a pas de commandeeval
, mais plutôt une chaîne. Si vous avez un exemple plus pertinent pour nous, nous pouvons essayer de vous aider.Il existe plusieurs niveaux de cotation. Les guillemets doubles (
"..."
) sauvegardent les espaces et plusieurs caractères spéciaux (~
,&
,|
,;
, ...) mais n'empêche pas l' expansion et la substitution de commande paramètre.Vous avez besoin de guillemets simples (
'
) ou d'une barre oblique inverse devant les caractères "dangereux".En général: vous devriez envisager d'utiliser
$(tail ...)
plutôt que des crochets. Les backticks sont la norme la plus ancienne mais nous parlons de si vieux qui$()
ne causent pas de problèmes à la plupart des gens. La nouvelle version est plus facile à lire et peut être imbriquée. Sans parler des problèmes de formatage ici sur sx ...la source
$(...)
produit toujours le même résultat - le shell l'exécute lorsque ma chaîne est définie.$()
mais vous avez quand même besoin des guillemets simples.