Leí sobre eso debería citar variables en bash, por ejemplo, "$ foo" en lugar de $ foo. Sin embargo, mientras escribía un script, encontré un caso en el que funciona sin comillas pero no con ellas:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
Este funciona:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Este no (tenga en cuenta las comillas dobles alrededor de $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
¿Cuál es la razón para esto?
Es la primera línea la buena versión; ¿O debería sospechar que hay un error oculto en algún lugar que causa este comportamiento?
En general, ¿dónde encuentro buena documentación para entender cómo funciona bash y sus citas? Al escribir este script, siento que comencé a trabajar en una base de prueba y error en lugar de entender las reglas.
wget
no sabe qué --mirror --no-host-directories
significa (como un argumento), pero lo maneja cuando se divide en dos argumentos. Muy pocos programas tratan espacios y comillas especialmente una vez que están dentro del vector de argumento. El problema es que bash
, y otros shells, deben ser>
bash
, por lo que puede imaginar que $a
es exactamente equivalente a escribir directamente su contenido. Ahora el problema es evidente: se a="-a -b"; cmd "$a"
expande cmd "-a -b"
, pero cmd
probablemente no sabe lo que eso significa. cmd $a
expande a cmd -a -b
, lo que probablemente hace el trabajo.