Bagaimana saya bisa meneruskan argumen yang disimpan pada variabel ke WGET

10

Saya sedang menulis skrip bash yang banyak menggunakan wget. Untuk mendefinisikan semua parameter umum di satu tempat, saya menyimpannya di variabel. Berikut sepotong kode:

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 tidak berfungsi. Entah bagaimana saya kehilangan cara yang tepat untuk menyimpan parameter pada variabel $ useragent, $ save_cookies_cmd, $ load_cookies_cmd dan caling wget melewati vars ini sebagai parameter.

Saya ingin commandline hasil seperti ini:

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: Solusi terakhir saya:

Pada akhirnya skrip saya berfungsi dengan benar dengan ini:

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

Terima kasih atas semua tanggapan Anda.

Filipe
sumber

Jawaban:

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

Perhatikan bahwa dalam panggilan wget, "$user_agent"dikutip. Ini sangat penting.

glenn jackman
sumber
Pintar menggunakan array. Terimakasih atas tanggapan Anda. Itu pasti akan membantu saya dalam memahami skrip bash yang lebih baik.
Filipe
3

Masalahnya terletak pada urutan ekspansi (lihat EKSPANSI man bashuntuk detailnya). Kutipan ganda di dalam variabel tidak berfungsi sebagai tanda kutip ganda ketika variabel diperluas:

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

Perhatikan bahwa menggunakan "$ b" tidak membantu Anda.

Gunakan array, sehingga Anda dapat membiarkan bash melakukan kerja keras dan Anda dapat melupakan tentang mengutip dan melarikan diri:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4
choroba
sumber
Terima kasih atas waktunya. Saya agak pemula dalam skrip bash dan trik ini akan selalu membantu saya mulai sekarang.
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

Maafkan saya, tapi saya telah mengambil kebebasan dari parameterizingfungsi Anda. Karena nilai-nilai di hanyaPARAMS akan mengatur variabel yang tidak disetel, Anda dapat mengganti nilainya dengan sangat mudah - ini memungkinkan Anda untuk mengatur default waras dan masih mengubah nilai per panggilan fungsi sesuka Anda. Sebagai contoh, dalam fungsi di atas, saya telah menetapkan semua nilai dan inilah output ketika dijalankan seperti: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

Tetapi jika saya mengatur "$userstring"ke NULL:

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

Atau:

    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

Atau:

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

Saya sudah menulis lebih banyak di sini dan di sini .parameter expansion

mikeserv
sumber