
저는 wget을 광범위하게 사용하는 bash 스크립트를 작성 중입니다. 모든 공통 매개변수를 한곳에서 정의하기 위해 이를 변수에 저장합니다. 이것은 코드 조각입니다:
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