【问题标题】:Passing string with spaces to bash script and using within string concatenation [duplicate]将带空格的字符串传递给bash脚本并在字符串连接中使用[重复]
【发布时间】:2019-11-04 14:54:44
【问题描述】:

我有一个 bash 脚本的参数,它可能是一个带空格的字符串。如何在字符串连接中使用它,如下所示:

#!/usr/bin/env bash

curl -X POST -H 'Content-type: application/json' \
--data '{"text":"'$1'"}' https://hooks.slack.com/services/<rest of URL secret!>

如果我这样做,从 cmd 行:

$./myscript.sh oneword

它工作得很好。但是如果我传递一个带空格的字符串:

$./myscript.sh "two words"

curl: (3) [globbing] unmatched close brace/bracket in column 5
invalid_payload%  

我尝试了各种引用来正确连接它,但无济于事。谢谢

【问题讨论】:

  • 不要手动生成 JSON,除非(可能)你已经知道 $1 是一个有效的 JSON 字符串。

标签: bash


【解决方案1】:

您还需要在 JSON 有效负载中引用 $1

curl -X POST -H 'Content-type: application/json' \
--data '{"text":"'"$1"'"}' https://hooks.slack.com/services/<rest of URL secret!>

【讨论】:

  • 如果不能安全地合并$1(它本身可能包含双引号),这可能会失败。
  • 如果双引号也可以在$1中传递,那么OP可以使用:"${1//\"/\\\"}"
  • jq 之类的东西构造 JSON 更安全。 "$(jq -n --arg x "$1" '{text: $x}')".
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2014-06-11
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多