je sais écrire
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
le résultat final me semble à peu près le même. Pourquoi devrais-je écrire l'un ou l'autre ? est-ce que certains d'entre eux ne sont pas portables/POSIX ?
Réponse acceptée :
VAR=$VAR1
est une version simplifiée de VAR=${VAR1}
. Il y a des choses que le second peut faire que le premier ne peut pas, par exemple référencer un index de tableau (non portable) ou supprimer une sous-chaîne (POSIX-portable). Voir la section Plus sur les variables du Guide Bash pour les débutants et l'expansion des paramètres dans la spécification POSIX.
Utiliser des guillemets autour d'une variable comme dans rm -- "$VAR1"
ou rm -- "${VAR}"
est une bonne idée. Cela fait du contenu de la variable une unité atomique. Si la valeur de la variable contient des blancs (enfin, des caractères dans le $IFS
variable spéciale, espaces par défaut) ou caractères globaux et que vous ne le mettez pas entre guillemets, alors chaque mot est pris en compte pour la génération du nom de fichier (globbing) dont l'expansion fait autant d'arguments que ce que vous faites.
$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'
$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename
Sur la portabilité :
Selon POSIX.1-2008 section 2.6.2, les accolades sont facultatives.