我正在编写一个脚本,其中多次运行curl 命令。在整个脚本中,curl 命令的使用各不相同,我想通过使用变量来替换将重复使用多次的命令的一部分来节省自己的时间(将来当我必须调试脚本时)。
curl -g -x "" -k
多次使用curl 命令但不同的脚本示例
# Usage 1
curl -g -x "" -k http://www.example.com/rest/v1/blah
# Usage 2
curl -g -x "" -k -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah
我想使用变量重写上面的脚本curl -g -x "" -k
# Snippet of curl command that will be used several times in script
curl_command="curl -g -x \"\" -k"
# Usage 1
$curl_command http://www.example.com/rest/v1/blah
# Usage 2
$curl_command -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah
运行重写的脚本会出现错误:
curl: (5) Could not resolve proxy: ""; Name or service not known
对于用法 1,它似乎正在执行curl -g -x '""' -k http://www.example.com/rest/v1/blah
,导致出现上面所示的错误。我尝试curl_command="curl -g -x '' -k"
在执行中分配变量并将其包装在大括号 {} 中,但出现类似的错误。这怎么写才能工作?
提前致谢 :)
答案1
基本上,你的问题是为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?
当您在$curl_command
引号外写时,这将获取变量的值curl_command
并在每个空格序列处将其拆分为单独的单词。 (然后,每个单词被解释为通配符模式,如果有匹配的文件名,则由匹配的文件名列表替换,但在您的情况下没有通配符,因此此步骤不会改变任何内容。)
引号是 shell 语法的一部分。它们不受未加引号的变量扩展的影响。因此该命令使用参数、和$curl_command
执行。curl
-g
-x
""
-k
您正在尝试将字符串列表(命令参数)填充到字符串中。那效果不太好。事实上,没有什么能让你得到空话。
稳健的解决方案是使用类型变量字符串列表存储字符串列表。这在 shell 中称为数组。 Bash、ksh 和 zsh 支持数组:
curl_command=(curl -g -x "" -k)
…
"${curl_command[@]}" http://www.example.com/rest/v1/blah
该变量curl_command
包含一个 5 元素数组,其元素为curl
、-g
、-x
、空字符串和-k
。
如果您需要一个普通的 sh 脚本,您可以使用位置参数,假设您不需要它们做其他任何事情。
set -- curl -g -x "" -k
…
"$@" http://www.example.com/rest/v1/blah
另一种可能性是使用函数来封装要多次使用的代码。
curl_command () {
curl -g -x "" -k "$@"
}
…
curl_command http://www.example.com/rest/v1/blah