Puedo escribir
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
el resultado final para mí todo parece casi el mismo. ¿Por qué debo escribir uno u otro? ¿Alguno de estos no es portátil/POSIX?
Respuesta aceptada:
VAR=$VAR1
es una versión simplificada de VAR=${VAR1}
. Hay cosas que el segundo puede hacer que el primero no puede, por ejemplo, hacer referencia a un índice de matriz (no portátil) o eliminar una subcadena (portátil POSIX). Consulte la sección Más sobre variables de la Guía de Bash para principiantes y Expansión de parámetros en la especificación POSIX.
Usando comillas alrededor de una variable como en rm -- "$VAR1"
o rm -- "${VAR}"
es una buena idea. Esto hace que el contenido de la variable sea una unidad atómica. Si el valor de la variable contiene espacios en blanco (bueno, caracteres en el $IFS
variable especial, espacios en blanco por defecto) o caracteres globales y no los cita, luego cada palabra se considera para la generación de nombres de archivo (globs) cuya expansión genera tantos argumentos para lo que sea que esté haciendo.
$ 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
Sobre portabilidad:
Según POSIX.1-2008 sección 2.6.2, las llaves son opcionales.