【发布时间】:2020-12-15 21:03:52
【问题描述】:
我想用两个变量(一个用于公共参数,一个用于 URL)组合一个 curl 调用,并通过命令替换捕获输出。当我添加需要用引号引起来的参数时,这会中断,比如-H "Accept: text/html"。
这是一个演示问题的小脚本,它调用public echo service 来显示发送的请求标头:
#!/bin/bash
COMMON_ARGS="--http1.1 -H \"Accept: text/html\""
URL="http://scooterlabs.com/echo"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "1 $RETVAL"
RETVAL=$(curl -s --http1.1 -H "Accept: text/html" $URL | grep Accept)
echo "2 $RETVAL"
输出:
1 [Accept] => */*
2 [Accept] => text/html
因此,我尝试通过变量提供标头的第一次尝试不起作用(curl 发送默认的Accept: */*),而我手动添加标头的第二次尝试有效。使用单引号和引号转义都没有帮助。
更新:当我在提交问题之前偶然发现BashFaq/050 时,我至少学到了一部分教训。问题是 word splitting 在调用给定命令之前由 shell 的解析器执行。在我的情况下,正确的做法是将参数作为数组提供(旧的bashes 可能不支持这个):
COMMON_ARGS=(--http1.1 -H "Accept: text/html")
RETVAL=$(curl -s "${COMMON_ARGS[@]}" $URL | grep Accept)
echo "3 $RETVAL"
输出:
3 [Accept] => text/html
但还有一件事我想不通:如果默认情况下分词作用于a space, a tab, and a newline.,那么为什么这个变体不起作用 - 没有空间可以错误地拆分?
COMMON_ARGS="--http1.1 -H 'Accept:text/html'"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "4 $RETVAL"
输出:
4 [Accept] => */*
【问题讨论】:
-
但是在 curl 看到标题之前,通常会在引号删除中删除单引号。通过将它们包含在双引号中,它们被保留了,但 curl 不知道如何处理它们。
-
@choroba:这很有意义。谢谢,请发表评论作为答案!
-
嗯。由于您发现了 BashFAQ #50 并修改了问题,因此它不会与我们对同一问题的许多其他问题重复。也许应该编辑标题以区分?
-
@CharlesDuffy 我不仅阅读了其中一个问题,而且答案没有传达缺失的信息......认为这可能对其他人有帮助!
标签: bash curl command-substitution