【问题标题】:Bash adding extra single quotes to curl command defined as "...$'...'..."Bash 在 curl 命令中添加额外的单引号,定义为 "...$'...'..."
【发布时间】:2018-09-26 21:31:15
【问题描述】:

这与Prevent bash from adding single quotes to variable output 非常相似,但这些答案都没有帮助我。

这个脚本:

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 之前添加了一个刻度,它正在转义我的release_description 中的单个刻度

想要的结果是:

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

如何让它删除转义序列并添加单个刻度?

【问题讨论】:

  • 请看这里的最后一段:stackoverflow.com/a/25777854/1566221
  • $'' 是它自己的引用风格。如果将 $'' 语法嵌套在双引号内,则您处于双引号上下文中,而不是 $''-quoted 上下文。
  • 另外,请注意 set -x 以一种引用样式编写的内容并以不同的引用样式回显它是完全合法的,只要底层字符串被表示(因此,传递给调用的程序)是一样的。换一种说法,set -x 使用的表示对curl 看待世界的方式没有影响,无论是双引号、单引号、$''-引号等。
  • ...另外,请注意set -e 颇具争议——它的行为常常令人惊讶,并且可能导致比它解决的问题更多的问题(f/e,它可以改变函数的方式行为取决于任何其他代码是否基于该函数的返回代码进行分支);那是在由于其行为随时间发生变化的地方而导致版本不兼容之前。请参阅the exercises in BashFAQ #105(以及该页面中的各种链接)以确保您知道自己要进入的内容。
  • 这个故事的寓意:不要相信set -ex。下面的答案使用set -ex 看起来是错误的,但会起作用

标签: bash curl


【解决方案1】:

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

正确的脚本应该是这样的

set -ex

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

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

【讨论】:

  • ...一个可以,当然,把--form release_description=$'\n new \n'放在同一行;我通常会将选项及其 optargs 分组。重要的是它们不会作为单个字符串的一部分被引用。
  • 您希望发布说明的值是多少?如果您想要文字字符串\n new \n,则使用release_description='\n new \n'。不过,这与您在问题中声称的预期结果不同。
猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 2020-11-16
  • 2022-09-24
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多