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

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

저는 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

나는 다음에 대해 더 많이 썼습니다.parameter expansion 여기그리고여기.

관련 정보