GNU/Linux >> Tutoriels Linux >  >> Linux

$var Vs ${var} Et citer ou ne pas citer ?

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.


Linux
  1. La différence entre une commande intégrée et une qui ne l'est pas ?

  2. Le package que je viens d'installer est-il légitime, et si ce n'est pas le cas, comment le désinstaller ?

  3. 7 Exemples d'opérateurs Linux Grep OR, Grep AND, Grep NOT

  4. tmux :se bloque et ne se charge pas, et ne répond à aucune commande d'option

  5. Autoconf vérifie le programme et échoue s'il n'est pas trouvé

Comment savoir si un package est installé ou non sous Linux et Unix

Le verrouillage de l'écran Ubuntu 17.10 ne fonctionne pas et est gris?

Différence entre les guillemets simples et doubles dans Bash Shell

Firefox a changé le workflow de téléchargement, et je ne suis pas fan

readlink -f et -e la description des options n'est pas claire

Pourquoi ma crontab ne fonctionne-t-elle pas et comment puis-je la dépanner ?