Ho letto che dovrei citare le variabili in bash, ad esempio "$ foo" invece di $ foo. Tuttavia, mentre scrivevo una sceneggiatura, ho trovato un caso in cui funziona senza virgolette ma non con loro:
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
Questo funziona:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Questo non lo fa (notare le doppie virgolette intorno a $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Qual è la ragione di ciò?
La prima riga è la buona versione; o dovrei sospettare che ci sia un errore nascosto da qualche parte che causa questo comportamento?
In generale, dove trovo una buona documentazione per capire come funziona bash e le sue quotazioni? Durante la stesura di questo script sento di aver iniziato a lavorare su una base di tentativi ed errori invece di comprendere le regole.
wget
non sa cosa --mirror --no-host-directories
significhi (come un argomento), ma lo gestisce quando è diviso in due argomenti. Pochissimi programmi trattano gli spazi e le virgolette specialmente quando sono all'interno del vettore argomento. Il problema è che bash
, e altre shell, dovrebbero essere>
bash
, quindi puoi immaginare che $a
sia esattamente equivalente a scrivere direttamente il suo contenuto. Ora il problema è evidente: si a="-a -b"; cmd "$a"
espande cmd "-a -b"
, ma cmd
probabilmente non sa cosa significhi. cmd $a
si espande a cmd -a -b
, che probabilmente fa il lavoro.