Bash将额外的单引号添加到定义为“…”的curl命令中$''&引用;

Bash将额外的单引号添加到定义为“…”的curl命令中$''&引用;,bash,curl,Bash,Curl,这非常类似于,但没有一个答案对我有帮助 此脚本: set -ex curl_headers=( --silent "--form release_description=$'\n new \n'" ) curl "${curl_headers[@]}" "example.com" 返回此输出: + curl_headers=(--silent "--form release_description=$'\n new \n'") + curl --silent '--form

这非常类似于,但没有一个答案对我有帮助

此脚本:

set -ex

curl_headers=(
    --silent
    "--form release_description=$'\n new \n'"
)

curl "${curl_headers[@]}" "example.com"
返回此输出:

+ curl_headers=(--silent "--form release_description=$'\n new \n'")
+ curl --silent '--form release_description=$'\''\n new \n'\''' example.com
它做了两件我不想做的事。它在
--form
之前添加了一个勾号,并在我的
发布描述中转义了一个勾号

预期的结果是:

curl --silent --form release_description=$'\n new \n' example.com

如何删除转义序列并添加单引号?

单引号正是跟踪模式(从
-x
选项)显示字符串的方式;这根本不会影响你的命令。主要问题是您将两个独立的参数(
--form
及其参数)组合成一个

正确的脚本应该类似于

set -ex

curl_headers=(
    --silent
    --form
    release_description=$'\n new \n'
)

curl "${curl_headers[@]}" "example.com"

单引号是跟踪模式(从
-x
选项)显示字符串的方式;这根本不会影响你的命令。主要问题是您将两个独立的参数(
--form
及其参数)组合成一个

正确的脚本应该类似于

set -ex

curl_headers=(
    --silent
    --form
    release_description=$'\n new \n'
)

curl "${curl_headers[@]}" "example.com"

请看最后一段:
$”
是它自己的引用风格。如果将
$'
语法嵌套在双引号中,则您处于双引号上下文中,而不是
$'
-引号上下文中。此外,请注意,
set-x
完全可以合法地将以一种引号样式编写的内容提取出来,并以不同的引号样式回显,只要表示底层字符串(因此,传递给被调用的程序)同样。换一种说法,
set-x
使用的表示法对
curl
看待世界的方式没有影响,无论是双引号、单引号、
$”
-引号等等……另一方面,请注意,
set-e
是非常有争议的——它的行为常常令人惊讶,并且可能导致错误问题比它解决的要多(f/e,它可以改变函数的行为方式,这取决于是否有任何其他代码基于该函数的返回代码进行分支);这是在人们进入因其行为随时间变化的地方而导致的版本不兼容之前。请参阅(以及该页面的各种链接)为了确保你知道你在做什么。这个故事的寓意是:不要相信
set-ex
。下面的答案使用
set-ex
看起来是错误的,但会起作用。请看一下这里的最后一段:
$'
是它自己的引用风格。如果你在双引号中嵌套
$'
语法,你就处于双引号中了xt,而不是
$'
-引用的上下文。另外,请注意
set-x
完全可以合法地获取以一种引用样式编写的内容,并以另一种引用样式回显它,只要底层字符串被表示(从而传递给调用的程序)同样。换一种说法,
set-x
使用的表示法对
curl
看待世界的方式没有影响,无论是双引号、单引号、
$”
-引号等等……另一方面,请注意,
set-e
是非常有争议的——它的行为常常令人惊讶,并且可能导致错误问题比它解决的要多(f/e,它可以改变函数的行为方式,这取决于是否有任何其他代码基于该函数的返回代码进行分支);这是在人们进入因其行为随时间变化的地方而导致的版本不兼容之前。请参阅(以及该页面的各种链接)为了确保你知道你将陷入什么境地。这个故事的寓意是:不要相信
set-ex
。下面的答案使用
set-ex
看起来是错误的,但会起作用……当然,你可以把
——form release\u description=$'\n new\n'
放在同一行;我通常会把选项和它们的OPTARG分组。重要的是这一点它们不是作为单个字符串的一部分引用的。您希望发布描述的值是多少?如果您想要文本字符串
\n new\n
,那么使用
release\u description='\n new\n'
。这与您在问题中声称的期望结果不同,不过……当然,可以将
--放在发布描述中scription=$'\n new\n'
位于同一行;我通常会将选项及其optarg分组。重要的是,它们不会作为单个字符串的一部分引用。您希望版本描述的值是什么?如果您希望文本字符串
\n new\n
,则使用
版本描述='\n new\n'
。这是不同的不过,你在问题中声称的预期结果与此不符。