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

标签 bash shell command-line-arguments wget

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

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

最佳答案

设置$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 会看到这些引用并成为用户的一部分- 通过网络发送的代理 header ,这是您不想要的。

关于bash - 如何将存储在变量上的参数传递给 WGET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22517676/

相关文章:

bash - 通过 ssh 运行具有嵌套引号的 shell 命令

java - 如何测试接受命令行参数的并发 Java 程序?

Python 与父 shell 环境一起工作

node.js - 在 ReactJS 中使用命令行参数

用于处理注释的 C 命令行解析器

bash - UNIX AWK 脚本 - 内存耗尽

bash -/bin/sh VS/bin/bash 中的 Unicode 字符

bash - 在 bash 中进行并行处理?

linux - 用于循环命令行开关和参数的 Shell 脚本

python - 我需要通过 .sh 文件安装 python 模块