shell bash,如何在单引号内回显变量

时间:2015-03-30 16:12:51

标签: json bash shell curl

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

有人可以帮助我,如何回应单引号内的变量?

2 个答案:

答案 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。

盐味。