변수에 저장된 인수를 WGET에 전달하는 방법


10

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 및 매개 변수로 매개 변수를 전달하는 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 call "$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 스크립트의 초보자이며 이러한 트릭은 항상 나에게 도움이 될 것입니다.
Filipe

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.