users.I想要使用bash脚本运行curl命令。 (以下命令在终端中完美运行)
curl -i -H "Content-Type: application/json" -X POST -d '{"mountpoint":"/gua-la-autentica-1426251559"}' http://127.0.0.1:5000/connect
但无法在bash中运行此命令。当在变量($ final)中给出mountpoint值时。
final="/gua-la-autentica-1426251559"
curl -i -H "Content-Type: application/json" -X POST -d '{"mountpoint":'$final'}' http://127.0.0.1:5000/connect
有人可以帮助我,如何回应单引号内的变量?
答案 0 :(得分:4)
应该引用JSON字符串值,参数扩展也应该引用。您可以通过在整个JSON字符串周围使用双引号并转义内部双引号来实现此目的,如下所示:
curl -i -H "Content-Type: application/json" -X POST -d "{\"mountpoint\":\"$final\"}" http://127.0.0.1:5000/connect
正如评论中所提到的,更强大的方法是使用jq
之类的工具来生成JSON:
json=$(jq -n --arg final "$final" '{ mountpoint: $final }')
curl -i -H "Content-Type: application/json" -X POST -d "$json" http://127.0.0.1:5000/connect
答案 1 :(得分:1)
我可能会用printf格式来做。它可以更容易地看到格式错误,并让您更好地控制输出:
final="/gua-la-autentica-1426251559"
fmt='{"mountpoint":"%s"}'
curl -i -H "Content-Type: application/json" -X POST \
-d "$(printf "$fmt" "$final")" \
http://127.0.0.1:5000/connect
我不知道您在实际使用案例中获得$final
的位置,但您可能还需要考虑检查它是否会破坏您的JSON。例如:
便携版:
if expr "$final" : '[A-Za-z0-9./]*$'; then
curl ...
else
echo "ERROR"
fi
仅限Bash版本(可能性能更好但便携性更低):
if [[ "$final" ]~ ^[A-Za-z0-9./]*$ ]]; then
curl ...
...
如果您的$final
变量甚至可能远远超出您的预期,那么检查您的输入非常重要。如果它以某种方式包含双引号,则您没有有效的JSON。
盐味。