【问题标题】:Quote handling in variables inside a command substitution命令替换中变量中的引号处理
【发布时间】: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


【解决方案1】:

没有空间可以错误拆分?

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

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多