Vous avez toujours besoin de guillemets autour des variables dans tous les contextes de liste , c'est-à-dire partout où la variable peut être étendue à plusieurs valeurs, sauf si vous voulez les 3 effets secondaires de laisser une variable sans guillemets.
les contextes de liste incluent des arguments à des commandes simples comme [
ou echo
, les for i in <here>
affectations aux tableaux ... Il existe d'autres contextes où les variables doivent également être citées. Le mieux est de toujours citer des variables, sauf si vous avez une très bonne raison de ne pas le faire.
Considérez l'absence de guillemets (dans les contextes de liste) comme l' opérateur split + glob .
Comme si echo $test
c'était echo glob(split("$test"))
.
Le comportement du shell est déroutant pour la plupart des gens car dans la plupart des autres langues, vous mettez des guillemets autour de chaînes fixes, comme puts("foo")
et non autour de variables (comme puts(var)
) tandis que dans le shell, c'est l'inverse: tout est une chaîne dans le shell, donc mettre des guillemets autour de tout serait lourd, vous echo test
, vous n'en avez pas besoin "echo" "test"
. Dans le shell, les guillemets sont utilisés pour autre chose: empêcher une signification particulière de certains caractères et / ou affecter le comportement de certaines extensions.
Dans [ -n $test ]
ou echo $test
, le shell se divisera $test
(sur les blancs par défaut), puis effectuera la génération du nom de fichier (développez tous les *
modèles, '?' ... dans la liste des fichiers correspondants), puis passera cette liste d'arguments aux commandes [
ou echo
.
Encore une fois, pensez-y comme "[" "-n" glob(split("$test")) "]"
. Si $test
est vide ou ne contient que des blancs (spc, tab, nl), alors l'opérateur split + glob renverra une liste vide, donc le [ -n $test ]
sera "[" "-n" "]"
, qui est un test pour vérifier si "-n" est la chaîne vide ou non. Mais imaginez ce qui se serait passé si $test
"*" ou "= foo" ...
Dans [ -n "$test" ]
, [
est passé les quatre arguments "["
, "-n"
, ""
et "]"
(sans les guillemets), ce qui est ce que nous voulons.
Que ce soit echo
ou [
ne fait aucune différence, c'est juste que cela echo
génère la même chose, qu'il ait passé un argument vide ou aucun argument du tout.
Voir aussi cette réponse à une question similaire pour plus de détails sur la [
commande et la [[...]]
construction.
echo
, les espaces supplémentaires et les nouvelles lignes seront supprimés.