我正在编写一个广泛使用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
答案 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标头通过电线发送,你不想要。