
私は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変数にパラメータを保存する正しい方法と、これらの変数をパラメータとして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" "$@"
}
皆様のご回答ありがとうございます。
答え1
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"
。これは非常に重要です。
答え2
問題は拡張順序です(man bash
詳細についてはEXPANSIONを参照)。変数が展開されると、変数内の二重引用符は二重引用符として使用できません。
$ 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
答え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