如何在 bash 中的 curl 命令中设置变量?

如何在 bash 中的 curl 命令中设置变量?

我有一个 bash 文件:

#!/bin/bash

# yesnobox.sh - An inputbox demon shell script
OUTPUT="/tmp/input.txt"

# create empty file
>$OUTPUT

# cleanup  - add a trap that will remove $OUTPUT
# if any of the signals - SIGHUP SIGINT SIGTERM it received.
trap "rm $OUTPUT; exit" SIGHUP SIGINT SIGTERM

# show an inputbox
dialog --title "Inputbox" \
--backtitle "Search vacancies" \
--inputbox "Enter your query " 8 60 2>$OUTPUT

# get respose
respose=$?

# get data stored in $OUPUT using input redirection
name=$(<$OUTPUT)

curl -d '{"query":"developer", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

在最后一个字符串中(卷曲命令)我想设置变量姓名反而“开发人员”.如何正确插入?

答案1

要访问变量,必须在名称前面加上美元符号:$name

但是,变量不会在用“单引号”括起来的字符串内展开。不过,如果展开后的值可能包含空格,则应将它们括在“双引号”内,以防止分词。

所以基本上有两种方法,我们要么将整个参数放在双引号中以使变量可扩展,但然后我们必须转义里面的双引号字符,以便它们最终出现在实际参数中(命令行缩短):

curl -d "{\"query\":\"$name\", \"turnOff\":true}" ...

或者,我们可以将不同类型的引号中的字符串文字紧挨在一起,从而将它们连接起来:

curl -d '{"query":"'"$name"'", \"turnOff\":true}' ...

答案2

由于 curls 参数的值-d在单引号内,因此不会有参数扩展,只需添加变量不起作用。您可以通过结束字符串文字、添加变量然后再次开始字符串文字来解决此问题:

curl -d '{"query":"'"$name"'", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

额外的双引号变量周围的使用是为了防止不必要的 shell 参数扩展。

答案3

@ByteCommander 的回答很好,假设您知道的值name是正确转义的 JSON 字符串文字。如果您不能(或不想)做出这样的假设,请使用类似 的工具jq为您生成 JSON。

curl -d "$(jq -n --arg n "$name" '{query: $n, turnOff: true}')" \
     -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

答案4

有些人可能会发现它更具可读性和可维护性,因为它避免使用转义以及难以跟踪和匹配的单引号和双引号序列。

使用 Bash 的等效方法sprintf来模板化替换:

printf -v data '{"query":"%s", "turnOff":true}' "developer"

curl -d "$data" -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

相关内容