Json 将变量(包含空格)传递给curl--数据字段

Json 将变量(包含空格)传递给curl--数据字段,json,bash,jq,Json,Bash,Jq,包含空格的参数将无法正确传递给curl命令。 在--data字段中未正确传递引号 如果我只是回显curl命令中使用的变量'curlData',我就得到了它应该得到的一切;例: $echo $curlData '{"name":"jason","description","service"}' 我不明白为什么curl没有像预期的那样扩展这个“curlData”变量: curl --data '{"name":"jason","description","service"}' 以下是我的代码示例

包含空格的参数将无法正确传递给curl命令。 在--data字段中未正确传递引号

如果我只是回显curl命令中使用的变量'curlData',我就得到了它应该得到的一切;例:

$echo $curlData
'{"name":"jason","description","service"}'
我不明白为什么curl没有像预期的那样扩展这个“curlData”变量:

curl --data '{"name":"jason","description","service"}'
以下是我的代码示例:

read -p "Name : " repoName
read -p "Description []: " repoDescription

curlData="'"{'"'name'"':'"'$repoName'"','"'descripton'"':'"'$repoDescription'"'}"'"

curl --data $curlData $apiURL 
错误是:

curl: (3) [globbing] unmatched close brace/bracket in column 26
谢谢你的帮助,我觉得我现在很忙

  • 引用所有变量展开式
  • 要确保
    curlData
    是带有正确转义特殊字符等的有效JSON值,请使用生成它

  • 如果您可以访问任何形式的包管理,我强烈推荐
    jo

    curlData=$(jo name="$repoName" description="$repoDescription")
    curl -d "$curlData" "$apiURL"
    

    echo$foo
    本身就有bug。始终使用
    echo“$foo”
    ,就像您应该引用其他扩展一样,除非您非常明确地知道为什么不这样做。请参阅…顺便说一句,出于同样的原因,写入
    echo“值为:$foo”
    ,而不是
    echo”是正确的。值为:$foo
    ;即使在连接常量字符串和扩展结果时,也希望字符串和扩展都被引用。@CharlesDuffy,对,我理解;-)。非常有启发性的链接顺便说一句,谢谢你的帮助!仅仅使用
    printf
    是不安全的。如果
    reposcription='hello',“callbackUrl”:http://evil.com/whatever“
    ,假定只能控制描述的用户只能设置回调URL。即使没有恶意,当用引号/空格/反斜杠/etc替换字符串的结果是无效的JSON时,也很容易出错。@Charles I应该先删除printf one,然后再删除+1,现在(jq语法比我的更简洁),但我认为这仍然是不完整的,因为它没有指示OP在调用
    curl
    时引用他们的论点(他们不是,而且非常需要)。@Charles这将使此答案与您的答案完全相同,您在我编辑添加jq解决方案2分钟后发布了此答案。你可以编辑我的,而不是张贴一个类似的。我一般认为在别人的主动维护下编辑别人的答案是不好的。当我点击“保存基于jq的答案”时,我的浏览器还没有刷新以显示你的修正案。不过,既然我已经删除了我的。乔,请随意修改?我找不到,它是从哪里来的?使用apt@dotHello您是否已完成apt更新?使用
    apt list jo
    显示我
    jo/stable,现在1.0-1+b1 amd64
    很好
    jo
    也很好!我喜欢它的语法稍微短一点。使用
    jo
    vs
    jq
    ,是否有人有一些优点和缺点?@dothhello它添加了一个依赖项。
    jq
    也是如此,但考虑到你可以用json做你需要做的一切,这就更容易证明了。这取决于您是否以及如何计划共享此代码。
    curlData=$(jo name="$repoName" description="$repoDescription")
    curl -d "$curlData" "$apiURL"