Les cotes sont nécessaires export foo="$var"ou local foo="$var"(ou readonly, typeset, declareet d' autres variables déclarant commandes ) en:
dash
- le
shde NetBSD (également basé sur le shell Almquist).
- La version
shde FreeBSD 9.2 ou plus ancienne (voir la modification dans la 9.3 )
yash
zshavec les versions antérieures à 5.1 in kshou shemulation (ou pour export var="$(cmd)"où zsheffectuerait le fractionnement des mots autrement (non globbing)).
Comme dans le cas contraire, le développement des variables serait sujet à la division des mots et / ou à la génération du nom de fichier, comme dans tout argument d'une autre commande.
Et ne sont pas nécessaires dans:
bash
ksh (toutes les implémentations)
- la version
shde FreeBSD 9.3 ou plus récente
- busybox 'basé sur les cendres
sh(depuis 2005)
zsh
Dans zsh, split + glob n'est jamais utilisé lors du développement des paramètres, à moins que in shou kshémulation, mais split (et non glob), lors de la substitution de commande. Depuis la version 5.1, les commandes export/ localet autres déclarations sont devenues des commandes doubles à mots clés / intégrées, comme dans les autres shells ci-dessus, ce qui signifie que les guillemets ne sont pas nécessaires, même dans sh/ kshémulation et même pour la substitution de commandes.
Il y a des cas spéciaux où la citation est nécessaire même dans ces coquilles bien que:
a="b=some value"
export "$a"
Ou plus généralement, si tout ce qui reste du =(y compris le =) est cité ou le résultat d'une expansion (comme export 'foo'="$var", export foo\="$var"ou export foo$((n+=1))="$var"(qui $((...))devrait également être cité en fait) ...). Ou en d'autres termes, lorsque l'argument exportne serait pas une affectation de variable valide s'il était écrit sans le export.
Si le export/ localnom de la commande elle - même est cité (même en partie comme "export" a="$b", 'ex'port a="$b", \export a="$b", ou même ""export a="$b"), les guillemets autour $bsont nécessaires , sauf pour AT & T kshet mksh.
Si export/ localou une partie de celle-ci est le résultat d'une expansion (comme dans cmd=export; "$cmd" a="$b"ou même export$(:) a="$b") ou dans des choses comme dryrun=; $dryrun export a="$b"), alors les guillemets sont nécessaires dans chaque shell.
Dans le cas de > /dev/null export a="$b", les guillemets sont nécessaires dans pdkshet certains de ses dérivés.
Car command export a="$b", les guillemets sont nécessaires dans chaque shell mais mkshet ksh93(avec les mêmes mises en garde concernant commandet exportne résultant pas d'une certaine expansion).
Ils ne sont nécessaires dans aucun shell lorsqu'ils sont écrits:
foo=$var export foo
(Cette syntaxe étant également compatible avec le shell Bourne mais dans les versions récentes de zsh, ne fonctionne que dans sh/ kshémulation).
(notez que cela var=value local varne devrait pas être utilisé car le comportement varie selon les coquilles).
Notez également que l'utilisation exportd'une affectation signifie également que le statut de sortie de cmdin export var="$(cmd)"est perdu. Le faire en tant que export var; var=$(cmd)n'a pas ce problème.
Méfiez-vous également de ce cas particulier avec bash:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Mon conseil serait de toujours citer.