【问题标题】:bash string interpolation returns empty string [duplicate]bash字符串插值返回空字符串[重复]
【发布时间】:2021-01-05 18:32:16
【问题描述】:

我正在编写简单的 curl POST 脚本,但我遇到了使用脚本中的数据初始化的变量的字符串插值问题。让我描述一下:

#!/bin/bash

EMAIL=$(source ./random_email_generator.sh) #this generates some random string 
echo "$EMAIL" #here email is printed well
curl --insecure --header "Content-Type: application/json" \
  --request POST \
  --data '{"email":'"$EMAIL"',"password":"validPassword"}' \ #problem lies here because email is always empty string 
 http:/ticketing.dev/api/users/signup 

总结一下,这里有很多引号和双引号,有点混淆,我该如何解析EMAIL的值来代替json body?

提前致谢

【问题讨论】:

  • 你能用bash -x yourscriptedit 运行这个问题来包含输出吗?您的代码没有完全遵循最佳实践——一个足够令人惊讶的电子邮件地址可能会生成无效的 JSON——但它应该工作,即便如此。
  • email="foo@mar.com" ; echo $(printf '{"email":"%s"}' $email)
  • @Abelisto,...嗯,这有其自身的问题,主要是由于缺少引号。看看如果您的电子邮件地址中有来自IFS 的字符会发生什么(f/e:IFS=.; email='foo@bar.com'; echo $(printf '{"email": "%s"}' $email));如果你有一个可以被解析为全局表达式的值,那就忽略了会发生什么......

标签: linux bash


【解决方案1】:

变量被正确插值。问题是你没有用双引号括起来,所以你创建了无效的 JSON。

curl --insecure --header "Content-Type: application/json" \
  --request POST \
  --data '{"email":"'"$EMAIL"'","password":"validPassword"}' \
  http:/ticketing.dev/api/users/signup 

如果您想查看命令的实际外观,请将echo 放在curl 之前或使用bash -x 运行脚本。你会看到

--data {"email":foo@bar.com,"password":"validPassword"}

如果您使用jq 工具在 bash 脚本中操作 JSON,那就更好了。

【讨论】:

  • 嘿,完全正确——我错过了字面双引号的缺失。尽管如此,电子邮件地址 is 在正文中,只是没有以使其有效 JSON 的方式被替换;所以OP声称它的位置有一个空字符串让我感到困惑。
  • 这不是第一次有人没有充分调试以说明实际问题。
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 2016-07-13
  • 2015-05-18
  • 2015-07-31
  • 2015-03-04
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多