【问题标题】:How can I use a variable in curl call within bash script如何在 bash 脚本中的 curl 调用中使用变量
【发布时间】:2017-04-12 16:13:26
【问题描述】:

我有这个简单的任务,我已经花了几个小时试图弄清楚如何在我的 bash 脚本中的 curl 调用中使用变量:

message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'

这是输出 ${message},字面意思是因为它在单引号内。如果我更改引号并将双引号和单引号放在里面,它会说找不到命令:您好,然后找不到命令:那里。

我怎样才能做到这一点?

【问题讨论】:

    标签: bash shell curl


    【解决方案1】:

    变量不在单引号内展开。使用双引号重写:

    curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"${message}\"}"
    

    请记住,双引号内的双引号必须转义。

    另一种变化可能是:

    curl -X POST -H 'Content-type: application/json' --data '{"text": "'"${message}"'"}'
    

    这个从单引号中分离出来,将${message} 括在双引号中以防止分词,然后以另一个单引号字符串结束。那就是:

    ... '{"text": "'"${message}"'"}'
        ^^^^^^^^^^^^
        single-quoted string
    
    
    ... '{"text": "'"${message}"'"}'
                    ^^^^^^^^^^^^
                    double-quoted string
    
    
    ... '{"text": "'"${message}"'"}'
                                ^^^^
                                single-quoted string
    

    【讨论】:

    • 该死!我知道这是非常简单的事情! :)) 谢谢。我会尽快接受答案。
    • 我更喜欢第二个。我实际上接近那个。我的一个版本看起来像这样'{"text": "'${message}'"}'。所以我只需要内部双引号,但该错误对于获得提示并不是很有帮助。
    【解决方案2】:

    虽然另一篇文章(和shellcheck)正确指出单引号可防止变量扩展,但可靠的解决方案是使用像jq 这样的JSON 工具:

    message="Hello there"
    curl -X POST -H 'Content-type: application/json' \
        --data "$(jq -n --arg var "$message"  '.text = $var')"
    

    即使$message 包含引号和反斜杠,这也能正常工作,而仅将其注入 JSON 字符串可能会导致数据损坏、无效 JSON 或安全问题。

    【讨论】:

    • 更好的是,只需将jq 的输出通过管道传输到curl 并使用@- 作为--data 的参数。这消除了一层引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2020-05-24
    • 2021-11-04
    • 1970-01-01
    • 2012-10-17
    • 2014-02-21
    • 2023-03-30
    相关资源
    最近更新 更多