【问题标题】:How to put a shell parameter in a string inside a string?如何将shell参数放在字符串内的字符串中?
【发布时间】:2019-12-18 11:24:04
【问题描述】:

有一个参数$1。这是一个电子邮件地址。我希望它成为此 curl 命令字符串中的字符串的一部分:

curl 'xy.com' --data-binary '{"email":"variableValueHere!!!"}'

所以一个包含参数$1的命令应该会导致这个命令...

curl 'xy.com' --data-binary '{"email":"xy@z.de"}'

如果$1 等于xy@z.de

我怎样才能把它放在那里? 到目前为止我尝试了什么:

curl 'xy.com' --data-binary '{"email":"$1"}'
curl 'xy.com' --data-binary '{"email":"`echo $1`"}'

【问题讨论】:

    标签: bash shell parameters


    【解决方案1】:

    试试这个:

    curl 'xy.com' --data-binary '{"email":"'"$1"'"}'
    

    它的串联

    • '{"email":"'
    • "$1"
    • '"}'

    并将您的参数作为带引号的字符串插入。

    【讨论】:

      【解决方案2】:

      最好使用合适的 JSON 解析器,例如 jq:

      curl 'xy.com' --data-binary "$(
        jq \
          --arg email "$1" \
          --null-input \
          --compact-output \
          '.email = $email'
      )"
      
      • "$(jq ...)":将jq 的输出捕获为字符串。
      • jq:是一个命令行 JSON 处理器。
        • --arg email "$1":将shell的参数$1的值作为jq变量$email传递。
        • --null-input:告诉jq 没有要解析的 JSON 输入流。
        • --compact-output:告诉jq 通过将每个 JSON 对象放在一行上来压缩其输出。
        • '.email = $email':这是 jq 查询,用于将 $email 变量的值分配为来自根 JSON 对象 .email 键的 JSON 字符串值。

      这也可以写得更紧凑:

      curl 'xy.com' --data-binary "$(jq -cn --arg e "$1" '.email=$e')"
      

      【讨论】:

        【解决方案3】:

        当你尝试这个时你会看到什么:

        curl 'xy.com' --data-binary '{"email":"`$1`"}'
        

        【讨论】:

        • 服务器收到电子邮件地址'$1'(stackoverflow 在这里解析我的文本输入)
        • ?诡异的?只是为了确认:在我的回答中,我使用了反引号(不是单引号),你也使用了反引号吗?
        • @Dominique : 你不小心把$1 放在了反引号中!
        • 这不是偶然的:这就是整个想法!反引号不仅被 StackOverflow 用于编辑,还被 UNIX 用于评估目的。
        • 是的,但你肯定不想将 $1 作为命令执行!!!
        【解决方案4】:

        怎么样

        curl xy.com --data-binary "{email:$1}"
        

        ?

        如果您希望第三个参数采用 JSON 格式,请将其写为:

        curl xy.com --data-binary  '{"email":"'"$1"'"}'
        

        您可以将其简化为

        curl xy.com --data-binary  '{"email":"'$1'"}'
        

        如果您确定您的电子邮件地址 ($1) 不包含空格或其他麻烦的字符。

        如果您真的想向 curl 传递额外的单引号(如您在评论中所述),只需在您的论点前面加上 a

        "'"
        

        【讨论】:

        • 服务器将无法解析 JSON,因为它不是有效的 JSON。
        • 您的问题与 JSON 有什么关系?我在您的文本中没有看到任何提到 JSON 的内容。如果涉及任何 json 问题,请修改您的帖子并添加 json 标签。
        • 如果你能指定,这也会有所帮助,curl 应该作为第三个参数接收哪个字符串。
        • 字符串包含一个 JSON 对象。 {"email":"xy@z.de"} 是 JSON。它是一个具有属性“email”和值“xy@z.de”的对象。
        • $1 是一个类似 x@y.com 的电子邮件地址,在将 $1 替换为电子邮件地址后 curl 命令应如下所示:curl 'xy.com' --data-binary '{"email":"x@y.com"}'
        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2012-12-21
        相关资源
        最近更新 更多