¿Cómo puedo pasar el argumento almacenado en una variable a WGET?

10

Estoy escribiendo un script bash que usa ampliamente wget. Para definir todos los parámetros comunes en un lugar, los almaceno en variables. Aquí hay un fragmento de código:

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

Tristemente no está funcionando. De alguna manera, me falta la forma correcta de almacenar parámetros en las variables $ useragent, $ save_cookies_cmd, $ load_cookies_cmd y caling wget pasando estos vars como parámetros.

Quiero la línea de comando de resultado como esta:

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

EDITAR: Mi solución final:

Al final, mi script funciona correctamente con esto:

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

Gracias por todas tus respuestas.

Filipe
fuente

Respuestas:

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

Tenga en cuenta que en la llamada wget, "$user_agent"se cita. Esto es crucial

Glenn Jackman
fuente
Inteligente usando la matriz. Gracias por su respuesta. Ciertamente me ayudará a comprender un mejor script bash.
Filipe
3

El problema radica en el orden de las expansiones (ver EXPANSIÓN en man bashpara más detalles). Las comillas dobles dentro de una variable no funcionan como comillas dobles cuando la variable se expande:

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

Tenga en cuenta que usar "$ b" no lo ayuda.

Use matrices, para que pueda dejar que bash haga el trabajo duro y puede olvidarse de citar y escapar:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4
choroba
fuente
Gracias por tu tiempo. Soy un poco novato en bash script y estos trucos siempre me ayudarán de ahora en adelante.
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

Perdóname, pero me he tomado la libertad de parameterizingtu función. Debido a que los valores de la PARAMSvoluntad sólo se establece una variable definida, se puede anular sus valores muy fácilmente - que le permite establecer configuraciones normales y aún así cambiar los valores por llamada función que te gusta. Por ejemplo, en la función anterior, configuré todos los valores echoy aquí está la salida cuando se ejecuta como está:

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

Pero si configuro "$userstring"a NULL:

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

O:

    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

O:

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

He escrito más aquí y aquí .parameter expansion

mikeserv
fuente