Eu li sobre isso que devo citar variáveis no bash, por exemplo, "$ foo" em vez de $ foo. No entanto, ao escrever um script, encontrei um caso em que funciona sem aspas, mas não com elas:
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 não (observe as aspas duplas entre $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Qual é a razão para isto?
A primeira linha é a boa versão; ou devo suspeitar que há um erro oculto em algum lugar que causa esse comportamento?
Em geral, onde encontro boa documentação para entender como o bash e suas citações funcionam? Ao escrever este script, sinto que comecei a trabalhar com base em tentativa e erro, em vez de entender as regras.
wget
não sabe o que --mirror --no-host-directories
significa (como um argumento), mas lida com isso quando é dividido em dois argumentos. Muito poucos programas tratam espaços e aspas especialmente quando estão dentro do vetor de argumento. O problema é que bash
, e outras conchas, são destinadas a ser>
bash
, então você pode imaginar que $a
é exatamente equivalente a escrever diretamente seu conteúdo. Agora a questão é evidente: a="-a -b"; cmd "$a"
expande para cmd "-a -b"
, mas cmd
provavelmente não sabe o que isso significa. cmd $a
expande-se para cmd -a -b
, o que provavelmente faz o trabalho.