如何将存储在变量上的参数传递给WGET

时间:2014-03-19 20:43:58

标签: bash shell command-line-arguments wget

我正在编写一个广泛使用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

1 个答案:

答案 0 :(得分: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"必需的原因。另一方面,用户代理的定义需要引用才能使分配工作,但不需要第二级别的引号,因为Wget会看到这些引用并成为用户的一部分-agent标头通过电线发送,你不想要。