Wie kann ich ein in einer Variablen gespeichertes Argument an WGET übergeben?

10

Ich schreibe ein Bash-Skript, das häufig wget verwendet. Um alle gängigen Parameter an einem Ort zu definieren, speichere ich sie in Variablen. Hier ist ein Stück 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 funktioniert nicht. Irgendwie fehlt mir der richtige Weg, um Parameter für die Variablen $ useragent, $ save_cookies_cmd, $ load_cookies_cmd zu speichern und diese Variablen als Parameter zu übergeben.

Ich möchte die Ergebnisbefehlszeile wie folgt:

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: Meine endgültige Lösung:

Am Ende funktioniert mein Skript korrekt damit:

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

Vielen Dank für alle Ihre Antworten.

Filipe
quelle

Antworten:

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

Beachten Sie, dass im wget-Aufruf angegeben "$user_agent"wird. Das ist entscheidend.

Glenn Jackman
quelle
Clever mit dem Array. Vielen Dank für Ihre Antwort. Es wird mir sicherlich helfen, ein besseres Bash-Skript zu verstehen.
Filipe
3

Das Problem liegt in der Reihenfolge der Erweiterungen ( man bashDetails siehe ERWEITERUNG in ). Doppelte Anführungszeichen in einer Variablen funktionieren nicht als doppelte Anführungszeichen, wenn die Variable erweitert wird:

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

Beachten Sie, dass die Verwendung von "$ b" Ihnen nicht hilft.

Verwenden Sie Arrays, damit Sie bash die harte Arbeit machen lassen und das Zitieren und Entkommen vergessen können:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4
Choroba
quelle
Vielen Dank für Ihre Zeit. Ich bin ein Anfänger im Bash-Skript und diese Tricks werden mir von nun an immer helfen.
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

Bitte vergib mir, aber ich habe mir die Freiheit parameterizingdeiner Funktion genommen. Da die Werte in PARAMSwird nur eine unset Variable gesetzt, können Sie ihre Werte sehr leicht außer Kraft setzen - es Sie Satz vernünftige Default ermöglicht und dennoch Werte pro Funktionsaufruf ändern , wie Sie möchten. Zum Beispiel habe ich in der obigen Funktion alle Werte auf gesetzt echound hier ist die Ausgabe, wenn sie so ausgeführt wird, wie sie ist:

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

Aber wenn ich mich "$userstring"auf NULL:

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

Oder:

    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

Oder:

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

Ich habe hier und hier mehr darüber geschrieben .parameter expansion

mikeserv
quelle