par exemple
if [ "$FOO" = "true" ]; then
contre
if [ $FOO = "true" ]; then
Quelle est la différence? Il semble que les deux déclarations fonctionnent également.
par exemple
if [ "$FOO" = "true" ]; then
contre
if [ $FOO = "true" ]; then
Quelle est la différence? Il semble que les deux déclarations fonctionnent également.
a='foo bar'; [[ $a == "foo bar" ]]
. Cependant, une variable qui ne contient pas de caractères glob ne doit pas être:[[ $a == $a ]]
. L'expansion des mots n'est pas effectuée entre crochets doubles. Et pour la correspondance des expressions rationnelles, le modèle sur le côté droit ne doit pas être cité ou il sera pris comme une chaîne littérale:[[ $a =~ .*oo.*r ]]
(le modèle doit être dans une variable non-citée, cependant, à la place ...[[ $a == foo* ]]
. Pouvez-vous fournir des exemples supplémentaires d'exigence de citation en plus de mon exemple de chaîne littérale?Réponses:
Si la valeur de
$FOO
est un seul mot qui ne contient pas de caractère générique\[*?
, les deux sont identiques.Si
$FOO
est non affecté, ou vide, ou plus d'un mot (c'est-à-dire, contient des espaces ou$IFS
), alors la version non citée est une erreur de syntaxe. S'il se trouve que c'est juste la bonne séquence de mots (comme0 -eq 0 -o false
), le résultat pourrait être arbitraire. Par conséquent, il est recommandé de toujours citer les variables dans les scripts shell.Incidemment,
"true"
n'a pas besoin d'être cité.la source
Pour illustrer les problèmes que cela pourrait causer, voici quelques exemples.
Disons que nous avons deux variables comme suit:
Nous avons maintenant deux variables contenant exactement la même chaîne / valeur. Si nous avons fait quelques instructions if pour tester le résultat, dans votre cas:
À ce stade, vous obtiendrez
bash: [: too many arguments
. Le $ FOO non coté contient maintenant trois valeurs, à savoir'[ , some , value'
.[
Le mot-clé test ne sait pas quoi exécuter car il s'attend à ce que le premier ou le deuxième argument soit un opérateur.Lorsque nous citons "$ FOO", nous disons explicitement
if
de regarder les bonnes valeurs là où aucun fractionnement de mot n'a lieu.Un autre exemple:
rm $my_file
signifie supprimer «A» «aléatoire» «file.txt», ce qui en fait trois fichiers.rm "$my_file"
supprimera "Un fichier aléatoire.txt" qui crée un fichier.J'espère que je ne vous ai pas confondu avec ces exemples.
la source
Dans ce cas précis, il n'y a pas de différence.
Cependant, si
$FOO
contient un espace ou des caractères spéciaux, vous aurez un problème.Dans le
"$FOO"
cas, il utilisera la variable au total, pour que la correspondance vous isole du problème d'espace.Cependant, si vous utilisez
$FOO
et qu'il existe un cas particulier, cela affectera l'instruction if.la source