【问题标题】:How can I pass argument stored on a variable to WGET如何将存储在变量中的参数传递给 WGET
【发布时间】:2014-04-26 09:29:15
【问题描述】:

我正在编写一个广泛使用 wget 的 bash 脚本。为了在一个地方定义所有常用参数,我将它们存储在变量中。这是一段代码:

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

不幸的是,它不起作用。不知何故,我错过了将参数存储在变量 $useragent、$save_cookies_cmd、$load_cookies_cmd 和 caling wget 将这些变量作为参数传递的正确方法。

我想要这样的结果命令行:

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

【问题讨论】:

    标签: bash shell command-line-arguments wget


    【解决方案1】:

    设置$useragent时去掉内引号,使用时保留双引号:

    useragent='--user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0'
    ...
    wget "$useragent" $load_cookies_cmd "$@"
    

    要理解为什么会这样,请注意wget --user-agent="string with spaces" 完全等同于wget "--user-agent=string with spaces"。 Wget 接收(并且必须要求)--user-agent=... 选项作为单个参数,无论引号的位置如何。

    引号用于防止 shell 拆分字符串,这就是为什么需要wget "$useragent"。另一方面,用户代理的定义需要引号才能工作,但不需要 second 级别的引号,因为 Wget 会看到这些引号并成为用户的一部分-agent 标头通过网络发送,这是您不想要的。

    【讨论】:

    • 工作。非常感谢。
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2015-12-20
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2021-06-25
    相关资源
    最近更新 更多