変数に格納されている引数をWGETに渡すにはどうすればよいですか


10

私は広範囲にwgetを使用するbashスクリプトを書いています。すべての共通パラメーターを1か所で定義するには、変数に格納します。これがコードの一部です。

useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"'
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@"  
    wget $useragent $load_cookies_cmd "$@"
}

サッドが機能していません。どういうわけか、変数$ useragent、$ save_cookies_cmd、$ load_cookies_cmd、およびこれらの変数をパラメーターとして渡すcaling wgetにパラメーターを格納する正しい方法がありません。

次のような結果のコマンドラインが必要です。

wget --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" --load-cookies /tmp/wget-cookies.txt --keep-session-cookies http://mysite.local/myfile.php

編集:私の最終的な解決策:

最後に、私のスクリプトはこれで正しく動作しています:

useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
useragent_cmd="--user-agent=$useragent"
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $load_cookies_cmd $useragent_cmd $@"  
    wget $load_cookies_cmd "$useragent_cmd" "$@"
}

ご回答いただきありがとうございます。

回答:


4

http://mywiki.wooledge.org/BashFAQ/050

user_agent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"'
cookies_file="/tmp/wget-cookies.txt"
save_cookies_opts=( --save-cookies "$cookies_file" --keep-session-cookies )
load_cookies_opts=( --load-cookies "$cookies_file" --keep-session-cookies )

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@"
    wget "$user_agent" "${load_cookies_opts[@]}" "$@"
}

wget呼び出しで"$user_agent"は、が引用されていることに注意してください。これは非常に重要です。


アレイを巧みに使用します。お返事をありがとうございます。それは確かに私がより良いbashスクリプトを理解するのに役立ちます。
Filipe

3

問題は展開の順序にあります(詳細については、「展開」を参照しman bashてください)。変数内の二重引用符は、変数が展開されている場合は二重引用符として機能しません。

$ a='1 "2 3" 4' ; for b in $a ; do echo $b ; done
1
"2
3"
4

「$ b」を使用しても役に立たないことに注意してください。

配列を使用すると、bashにハードワークを任せることができ、引用やエスケープを忘れることができます。

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4

御時間ありがとうございます。私はbashスクリプトの初心者であり、これらのトリックはこれからいつも私を助けてくれます。
フィリップ

3
    mywget() ( echo log "wget $quiet \
                         userstring=${userstring:-unset} \
                         cookies=${cookies:-no} $@"
            echo wget ${userstring:+--useragent="$userstring"} \
                    ${cookies:+--${cookies}-cookies \
                    "$cookies_file" --keep-session-cookies} "$@"
    ) <<-PARAMS
            ${DQ=$(printf \\042)}
            ${NL=
}
            ${userstring="${DQ}Mozilla/5.0 \
                (Windows NT 6.1; WOW64; rv:27.0) \
                Gecko/20100101 Firefox/27.0${DQ}"}
            ${cookies_file="/tmp/wget-cookies.txt"}
            ${cookies=save}
    PARAMS

許してください、しかし私はparameterizingあなたの機能の自由を奪いました。値なのでPARAMS意志が唯一の未設定の変数を設定して、あなたは非常に簡単にそれらの値を上書きすることができます-それはセット正気のデフォルトにあなたを可能にしながらも、好きな関数呼び出しごとに値を変更します。たとえば、上記の関数では、すべての値をに設定しecho、そのまま実行した場合の出力を次に示します。

log wget  userstring="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    cookies=save
wget --useragent="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    --save-cookies /tmp/wget-cookies.txt \
    --keep-session-cookies

しかし、私がに設定"$userstring"した場合NULL

    userstring= mywget
log wget  userstring=unset cookies=save
wget --save-cookies /tmp/wget-cookies.txt --keep-session-cookies

または:

    cookies=load cookies_file=/some/other/cookie.file mywget
log wget  userstring="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    cookies=load
wget --useragent="Mozilla/5.0 \
    (Windows NT 6.1; WOW64; rv:27.0) \
    Gecko/20100101 Firefox/27.0" \
    --load-cookies /some/other/cookie.file \
    --keep-session-cookies

または:

    cookies= userstring= mywget
log wget  userstring=unset cookies=no
wget

ここここでもっと書いてますparameter expansion

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.