引用変数のオプションは失敗しますが、引用されていない変数が機能するのはなぜですか?

引用変数のオプションは失敗しますが、引用されていない変数が機能するのはなぜですか?

$fooの代わりに"$foo"のようにbashで変数を引用しなければならないという内容を読みました。しかし、スクリプトの作成中に引用符なしで動作しますが、引用符を使用すると動作しない状況が見つかりました。

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とその参照がどのように機能するかについての良いドキュメントはどこにありますか?このスクリプトの作成中に、私はルールを理解するのではなく、試行錯誤に基づいて作業を開始するように感じました。

ベストアンサー1

最も信頼性の高いエンコード方法は配列を使用することです。

wget_options=(
    --mirror 
    --no-host-directories
    --directory_prefix="$1"
)
wget "${wget_options[@]}" "$2/$3"

おすすめ記事