【问题标题】:curl with variables - Bash [duplicate]带有变量的卷曲 - Bash [重复]
【发布时间】:2022-02-23 04:43:16
【问题描述】:

我正在尝试在以下循环中使用 curl 发帖:

for name in "${first_name[@]}"; do
        password=$(</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c16; echo "")
        curl -X POST -H "Content-Type: application/json" -H "Authorization: Token ${token}" -d '{"username": "${username[$name]}", "password": "${password}", "email": "${email[$name]}",  "first_name": "${name}", "last_name": "${last_name[$name]}", "is_staff": "${staff[$name]}", "is_active": "${active[$name]}", "groups": ["${group_id}"]' https://app.com/api/users/users/
done

使用此语法,我收到以下错误:

{"detail":"JSON parse error - Expecting ',' delimiter: line 1 column 242 (char 241)"}

每个变量都有一个值,因为我在循环中使用回显打印它们。

看起来像是语法错误。有什么想法有什么问题吗?

谢谢。

【问题讨论】:

  • 您将参数单引号引用到-d,因此您的参数都不会被扩展。
  • 使用jq 生成有效负载,因为它负责安全地转义任何参数值以为您生成有效的 JSON。
  • “json”对象的末尾还缺少}
  • 你可以试试jo
  • 链接副本上排名靠前的答案将为您提供比当前直接在此处添加的答案更强大的解决方案;我强烈建议您链接并阅读它们。

标签: json bash curl


【解决方案1】:

试试这个:

for name in "${first_name[@]}"; do
    password=$(</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' |
               head -c16; echo "")
    curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Token ${token}" \
        -d "$(cat << EOF
{"username": "${username[$name]}",
 "password": "${password}",
 "email": "${email[$name]}",
 "first_name": "${name}",
 "last_name": "${last_name[$name]}",
 "is_staff": "${staff[$name]}",
 "is_active": "${active[$name]}",
 "groups": ["${group_id}"]
}
EOF
        )" https://app.com/api/users/users/
done

【讨论】:

  • 这不会修复任何在 JSON 字符串中无效的数据而不进行转义。考虑使用Joe ("Johnny") Hill 的用户——"s 需要添加反斜杠。像jq 这样的工具会自动执行此操作。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多