Citer une variable dans le script shell "if"

par exemple

if [ "$FOO" = "true" ]; then 

contre

 if [ $FOO = "true" ]; then 

Quel est le différent? Semble deux des déclarations fonctionne également.

Si la valeur de $FOO est un seul mot qui ne contient pas de caractère générique \[*? , alors les deux sont identiques.

Si $FOO est non assigné ou vide, ou plus d'un mot (c'est-à-dire contient des espaces blancs ou $IFS ), la version non cotée est une erreur de syntaxe. S'il se trouve que la bonne séquence de mots (comme 0 -eq 0 -o false ), le résultat pourrait être arbitraire. Par conséquent, il est recommandé de toujours citer des variables dans des scripts shell.

Incidemment, "true" n'a pas besoin d'être cité.

Pour illustrer les problèmes que cela pourrait causer, voici quelques exemples.

Disons que nous avons deux variables comme suit:

 FOO="some value" BAR="some value" 

Nous avons maintenant deux variables qui contiennent exactement la même string / valeur. Si nous avons fait des déclarations si pour tester le résultat, dans votre cas:

 if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi 

À ce stade, vous obtiendrez bash: [: too many arguments . Le $ FOO non coté contient maintenant trois valeurs, à savoir '[ , some , value' . [ mot-key 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 faut regarder les bonnes valeurs où il n'y a pas de division de mots.

Un autre exemple:

 my_file="A random file.txt" 
  • faire rm $my_file signifie supprimer 'A' 'random' 'file.txt' qui en fait trois files.
  • faire rm "$my_file" va supprimer "Un file.txt random" qui crée un file.

J'espère que je ne vous ai pas confondu avec ces exemples.

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 cas "$FOO" , il utilisera la variable au total, pour que la correspondance vous isolant du problème d'espace.

Cependant, si vous utilisez $FOO et qu'il y a un cas particulier, cela affectera l'instruction if.