Ich habe darüber gelesen, dass ich Variablen in bash zitieren sollte, zB "$ foo" anstelle von $ foo. Beim Schreiben eines Skripts stieß ich jedoch auf einen Fall, in dem es ohne Anführungszeichen, jedoch nicht mit diesen funktioniert:
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
Dieser funktioniert:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Dies ist nicht der Fall (beachten Sie die doppelten Anführungszeichen um $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Was ist der Grund dafür?
Ist die erste Zeile die gute Version? oder sollte ich vermuten, dass irgendwo ein versteckter Fehler vorliegt, der dieses Verhalten verursacht?
Wo finde ich im Allgemeinen eine gute Dokumentation, um zu verstehen, wie Bash und seine Zitate funktionieren? Während ich dieses Skript schreibe, habe ich das Gefühl, dass ich angefangen habe, auf einer Trial-and-Error-Basis zu arbeiten, anstatt die Regeln zu verstehen.
wget
das nicht weiß, was --mirror --no-host-directories
bedeutet (als ein Argument), aber es behandelt es, wenn es in zwei Argumente aufgeteilt ist. Sehr wenige Programme behandeln Leerzeichen und Anführungszeichen besonders, wenn sie sich innerhalb des Argumentvektors befinden. Das Problem ist, dass bash
, und andere Muscheln, sollen>
bash
Sie können sich also vorstellen, dass $a
dies dem direkten Schreiben des Inhalts entspricht. Jetzt ist das Problem offensichtlich: a="-a -b"; cmd "$a"
Erweitert sich zu cmd "-a -b"
, cmd
weiß aber wahrscheinlich nicht, was das bedeutet. cmd $a
erweitert sich cmd -a -b
, was wahrscheinlich funktioniert .