Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 命令替换中变量的引号处理_Bash_Curl_Command Substitution - Fatal编程技术网

Bash 命令替换中变量的引号处理

Bash 命令替换中变量的引号处理,bash,curl,command-substitution,Bash,Curl,Command Substitution,我想用两个变量(一个用于公共参数,一个用于URL)组合一个curl调用,并通过命令替换捕获输出。当我添加需要加引号的参数时,这会中断,比如说-H“Accept:text/html” 下面是一个演示问题的小脚本,它调用a来显示发送的请求头: #!/bin/bash COMMON_ARGS="--http1.1 -H \"Accept: text/html\"" URL="http://scooterlabs.com/echo" RETVA

我想用两个变量(一个用于公共参数,一个用于URL)组合一个
curl
调用,并通过命令替换捕获输出。当我添加需要加引号的参数时,这会中断,比如说
-H“Accept:text/html”

下面是一个演示问题的小脚本,它调用a来显示发送的请求头:

#!/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
3             [Accept] => text/html
4             [Accept] => */*
因此,我尝试通过变量提供标题的第一次尝试无效(
curl
发送默认的
Accept://*
),而我手动添加标题的第二次尝试有效。使用单引号或引号转义都没有帮助


更新:在提交问题之前,我偶然发现了一个问题,这至少是我在这里学到的一部分。该问题由shell的解析器在调用给定命令之前执行。在我的案例中,正确的方法是将参数作为数组提供(较旧的
bash
es可能不支持此操作):

输出:

1           [Accept] => */*
2           [Accept] => text/html
3             [Accept] => text/html
4             [Accept] => */*
但有一件事我还是搞不清楚:如果默认情况下分词起作用,那么为什么这个变体不起作用——没有空间来错误地分词

COMMON_ARGS="--http1.1 -H 'Accept:text/html'"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "4 $RETVAL"
输出:

1           [Accept] => */*
2           [Accept] => text/html
3             [Accept] => text/html
4             [Accept] => */*
没有空间可以错误地分开吗

COMMON_ARGS="--http1.1 -H 'Accept:text/html'"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "4 $RETVAL"

但是,在curl看到标题之前,在quote remove中通常会删除单引号。通过将它们包含在双引号中,它们被保留了下来,但是curl不知道如何处理它们。

但是在curl看到标题之前,通常会在引号删除中删除单引号。通过在双引号中包含它们,它们被保留了下来,但是curl不知道如何处理它们。@choroba:这很有道理。谢谢,请将该评论作为答案发布!嗯。既然你发现了BashFAQ#50并修改了这个问题,这就使得它与我们关于同一个问题的许多其他问题不那么重复了。也许应该编辑标题来区分?@CharlesDuffy我读到的不仅仅是这些问题中的一个,但缺少的信息并没有通过答案传达出来。。。我想这可能会帮助别人!