Se necesitan Cotizaciones en export foo="$var"o local foo="$var"(o readonly, typeset, declarey otras variables que se declara comandos ) en:
dash
- el
shde NetBSD (también basado en el shell Almquist).
- El
shde FreeBSD 9.2 o anterior (ver el cambio en 9.3 )
yash
zshcon versiones anteriores a 5.1 en ksho shemulación (o para export var="$(cmd)"dónde zshse dividiría la palabra de otra manera (no globular)).
De lo contrario, la expansión de la variable estaría sujeta a la división de palabras y / o generación de nombre de archivo como en cualquier argumento a cualquier otro comando.
Y no son necesarios en:
bash
ksh (todas las implementaciones)
- el
shde FreeBSD 9.3 o más reciente
- busybox 'basado en cenizas
sh(desde 2005)
zsh
En zsh, split + glob nunca se realiza tras la expansión de parámetros, a menos que sea en sho kshemulación, pero split (no glob) se realiza tras la sustitución del comando. Desde la versión 5.1, export/ localy otros comandos de declaración se han convertido en comandos duales de palabras clave / incorporados como en los otros shells anteriores, lo que significa que no es necesario citar, incluso en sh/ kshemulación e incluso para la sustitución de comandos.
Hay casos especiales en los que es necesario citar incluso en esos depósitos, como:
a="b=some value"
export "$a"
O más en general, en todo caso queda de la =(incluyendo el =) es citado o el resultado de una cierta expansión (como export 'foo'="$var", export foo\="$var"o export foo$((n+=1))="$var"(que $((...))también debe citarse en realidad) ...). O en otras palabras, cuando el argumento de que exportno sería una asignación de variables válidas si son escritos sin el export.
Si el export/ localnombre del comando en sí es citado (aunque sea en parte, como "export" a="$b", 'ex'port a="$b", \export a="$b", o incluso ""export a="$b"), las comillas $bson necesarias excepto en AT & T kshy mksh.
Si export/ localo alguna parte es el resultado de una expansión (como en cmd=export; "$cmd" a="$b"o incluso export$(:) a="$b") o en cosas como dryrun=; $dryrun export a="$b"), entonces las comillas son necesarias en cada shell.
En el caso de > /dev/null export a="$b", son necesarias las comillas en pdkshy algunos de sus derivados.
Para command export a="$b", las comillas son necesarias en cada shell pero mkshy ksh93(con las mismas advertencias sobre commandy exportno ser el resultado de alguna expansión).
Ellos no son necesarios en cualquier shell cuando se escribe:
foo=$var export foo
(que la sintaxis ser también compatible con el shell Bourne pero en versiones recientes de zsh, trabajar sólo cuando en sh/ kshemulación).
(Tenga en cuenta que var=value local varno debe ser utilizado como el comportamiento varía a través de conchas).
También tenga en cuenta que el uso exportde una asignación también significa que el estado de salida cmdde export var="$(cmd)"se pierde. Hacerlo como export var; var=$(cmd)no tiene ese problema.
También tenga cuidado con este caso especial con bash:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Mi consejo sería citar siempre.