私は、bfooで変数を引用する必要があることを読みました。たとえば、$ fooではなく「$ foo」です。しかし、スクリプトを書いているときに、引用符なしでは機能するが、引用符なしでは機能しないケースを見つけました。
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
これは動作します:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
これはしません($ wget_optionsの前後の二重引用符に注意してください):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
この理由は何ですか?
最初の行は良いバージョンです。または、この動作の原因となる隠しエラーがあると疑うべきですか?
一般に、bashとその引用がどのように機能するかを理解するための優れたドキュメントはどこにありますか?このスクリプトを書いている間、私はルールを理解するのではなく、試行錯誤のベースに取り組み始めたと感じています。
wget
わかりませんが--mirror --no-host-directories
、2つの引数に分割されたときに処理されます。引数ベクトル内にあるスペースと引用符を特別に扱うプログラムはほとんどありません。問題はbash
bash
ので、$a
その内容を直接記述するのとまったく同じだと想像できます。これで問題が明らかになりました:にa="-a -b"; cmd "$a"
展開されますcmd "-a -b"
が、cmd
おそらくそれが何を意味するのか分からないでしょう。cmd $a
に展開するとcmd -a -b
、おそらく動作します。