Làm cách nào tôi có thể chuyển đối số được lưu trữ trên một biến sang WGET


10

Tôi đang viết một tập lệnh bash sử dụng rộng rãi wget. Để xác định tất cả các tham số phổ biến ở một nơi tôi lưu trữ chúng trên các biến. Đây là một đoạn mã:

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

Đáng buồn là không làm việc. Bằng cách nào đó, tôi đang thiếu cách lưu trữ tham số đúng trên các biến $ useragent, $ save_cookies_cmd, $ load_cookies_cmd và caling wget truyền các vars này làm tham số.

Tôi muốn dòng lệnh kết quả như thế này:

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: Giải pháp cuối cùng của tôi:

Cuối cùng, kịch bản của tôi hoạt động chính xác với điều này:

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

Cảm ơn sự phản hồi của bạn.

Câu trả lời:


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

Lưu ý rằng trong cuộc gọi wget, "$user_agent"được trích dẫn. Điều này là rất quan trọng.


Khéo léo sử dụng mảng. Cám ơn phản hồi của bạn. Nó chắc chắn sẽ giúp tôi hiểu kịch bản bash tốt hơn.
Filipe

3

Vấn đề nằm ở thứ tự mở rộng (xem MỞ RỘNG man bashđể biết chi tiết). Dấu ngoặc kép bên trong một biến không hoạt động như dấu ngoặc kép khi biến được mở rộng:

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

Lưu ý rằng việc sử dụng "$ b" không giúp ích gì cho bạn.

Sử dụng mảng, vì vậy bạn có thể để bash thực hiện công việc khó khăn và bạn có thể quên đi việc trích dẫn và thoát:

$ a=(1 '2 3' 4) ; for b in "${a[@]}" ; do echo $b ; done
1
2 3
4

Cảm ơn vì đã dành thời gian cho tôi. Tôi là người mới trong kịch bản bash và những thủ thuật này sẽ luôn giúp tôi kể từ bây giờ.
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

Xin vui lòng tha thứ cho tôi, nhưng tôi đã tự do về parameterizingchức năng của bạn. Vì các giá trị trong PARAMSsẽ chỉ đặt biến không đặt, nên bạn có thể ghi đè giá trị của chúng rất dễ dàng - nó cho phép bạn đặt mặc định lành mạnh và vẫn thay đổi giá trị cho mỗi lệnh gọi theo ý muốn. Chẳng hạn, trong hàm trên, tôi đã đặt tất cả các giá trị thành echovà đây là đầu ra khi chạy như sau:

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

Nhưng nếu tôi đặt "$userstring"thành NULL:

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

Hoặc là:

    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

Hoặc là:

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

Tôi đã viết nhiều hơn ở đâyở đây .parameter expansion

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.