Comment passer un argument stocké sur une variable à WGET

10

J'écris un script bash qui utilise largement wget. Pour définir tous les paramètres communs en un seul endroit, je les stocke sur des variables. Voici un morceau de code:

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 "$@"
}

Saddly ne fonctionne pas. D'une certaine manière, je manque la bonne façon de stocker les paramètres sur les variables $ useragent, $ save_cookies_cmd, $ load_cookies_cmd et caling wget en passant ces variables en tant que paramètres.

Je veux la ligne de commande de résultat comme ceci:

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

EDIT: Ma solution finale:

En fin de compte, mon script fonctionne correctement avec ceci:

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" "$@"
}

Merci pour toutes vos réponses.

Filipe
la source

Réponses:

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[@]}" "$@"
}

Notez que dans l'appel wget, "$user_agent"est cité. C'est crucial.

glenn jackman
la source
Intelligent en utilisant le tableau. Merci pour votre réponse. Cela m'aidera certainement à mieux comprendre le script bash.
Filipe
3

Le problème réside dans l'ordre des extensions (voir EXPANSION dans man bashpour plus de détails). Les guillemets doubles à l'intérieur d'une variable ne fonctionnent pas comme des guillemets doubles lorsque la variable est développée:

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

Notez que l'utilisation de "$ b" ne vous aide pas.

Utilisez des tableaux, afin que vous puissiez laisser bash faire le travail et oublier les citations et les échappements:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4
choroba
la source
Merci pour votre temps. Je suis un peu novice dans le script bash et ces astuces m'aideront toujours à partir de maintenant.
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

Veuillez me pardonner, mais j'ai pris la liberté de parameterizingvotre fonction. Parce que les valeurs PARAMSseront uniquement définir une variable unset, vous pouvez remplacer les valeurs très facilement - il vous permet de définir les valeurs par défaut de sain d' esprit et pourtant encore changer les valeurs par appel de fonction que vous aimez. Par exemple, dans la fonction ci-dessus, j'ai défini toutes les valeurs echoet voici la sortie lorsqu'elle est exécutée telle quelle:

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

Mais si je mets "$userstring"à NULL:

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

Ou:

    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

Ou:

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

J'ai écrit plus ici et ici .parameter expansion

mikeserv
la source