bash脚本中的四重嵌套报价

时间:2019-07-27 08:43:55

标签: bash shell

我正在使用 curl 从GraphQL API获取项目。我需要发送商品名称以获取其ID作为响应。当名称只是一个单词时,这种方法可以正常工作,但是当它包含空格时,我似乎无法使其正常工作。

itemName="Variable with blank spaces"
curl -X POST -data '{"query": "{getItems(jql: \"text ~ '$itemName'\") {results {id}}"}'

如何在上面的查询中转义$ itemName

2 个答案:

答案 0 :(得分:1)

您必须转义'。因此,结束引号'转义单\',然后添加项目"$itemName",然后添加单引号\',然后重新开始单引号'

curl -X POST -data '{"query": "{getItems(jql: \"text ~ '\'"$itemName"\''\") {results {id}}"}'

或使用"

curl -X POST -data "{\"query\": \"{getItems(jql: \\\"text ~ '$itemName'\\\") {results {id}}\"}"

答案 1 :(得分:1)

在任何{shell中,'分隔的字符串或脚本中都不能包含'。尝试进行任何逃逸都不会使其起作用。期。因此,要使'出现在命令行中,您需要脱离封闭的',提供一个',然后再回到其中以继续其余的操作'分隔的字符串/命令。

'转换为字符串的通常语法是在需要'\''的任何地方使用',例如:

str='foo'\''bar'

将变量str设置为foo'bar

因此,在您的命令行中,您将使用以下命令来获取'

curl -X POST -data '{"query": "{getItems(jql: \"text ~ '\''$itemName'\''\") {results {id}}"}'

,但是您还需要让shell展开$itemName,您还需要打破'的使用,并在返回shell时也将双引号括起来,以免出现泛滥和扩展(请参见https://mywiki.wooledge.org/Quotes)。您可以这样写:

curl -X POST -data '{"query": "{getItems(jql: \"text ~ '\'''"$itemName"''\''\") {results {id}}"}'

但是我们得到一个'-pileup,它可以立即两次进入/退出shell,这是没有必要的-只需留在shell中,然后在其中扩展变量即可。因此,您可以将其减少为:

curl -X POST -data '{"query": "{getItems(jql: \"text ~ '\'"$itemName"\''\") {results {id}}"}'

或者,因为\'"'"相同:

curl -X POST -data '{"query": "{getItems(jql: \"text ~ '"'$itemName'"'\") {results {id}}"}'