AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 414597
Accepted
Bernie Lenz
Bernie Lenz
Asked: 2018-01-04 10:23:08 +0800 CST2018-01-04 10:23:08 +0800 CST 2018-01-04 10:23:08 +0800 CST

bash 转义引号

  • 772

对于如何在 bash 脚本中转义引号,我遇到了一个有趣的挑战。

我的 bash 脚本有一个很长的 curl 调用,其中传递了一个大的 -d json 结构。

#!/bin/bash

Value4Variable=Value4

curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d  \
'{"Variable1":"Value1", 
"Variable2":"Value2\'s",  # escape of quote doesnt work because of the previous single quote and backslash
"Variable3":"Value3",
"Variable4":"'"$Value4Variable"'", 
"Variable5":"Value5"
}' \
https://www.hashemian.com/tools/form-post-tester.php

在 json 结构中添加单引号的最佳方法是什么?我尝试了各种组合,但没有成功。

bash scripting
  • 3 3 个回答
  • 7434 Views

3 个回答

  • Voted
  1. Best Answer
    Michael Daffin
    2018-01-04T10:45:34+08:002018-01-04T10:45:34+08:00

    有多种方法可以用不同的引号转义长字符串。最简单的就是结束单引号,转义单引号:

    '...'\''...'
    

    但是你可以做一些更好的事情。Heredocs 是避免引用问题的好方法:

    curl -s -X POST https://www.hashemian.com/tools/form-post-tester.php \
        -H "Content-Type: application/json" \
        -H "Accept: application/json" \
        -d  @- <<EOF
    {
        "Variable1":"Value1", 
        "Variable2":"Value2's",
        "Variable3":"Value3",
        "Variable4":"$Value4Variable", 
        "Variable5":"Value5"
    }
    EOF
    

    @-告诉 curl 从标准输入读取并<<EOF启动将被输入 curl 标准输入的 heredoc。heredoc 的好处是您不需要转义任何引号,并且可以在其中使用 bash 变量,无需担心如何转义引号并使整个内容更具可读性。

    • 2
  2. RomanPerekhrest
    2018-01-04T10:45:23+08:002018-01-04T10:45:23+08:00

    我会使用--data @filename符号从文件中读取数据:

    样本json-data-file内容:

    {"Variable1":"Value1", 
    "Variable2":"Value2's",
    "Variable3":"Value3",
    "Variable4":"'$Value4Variable'", 
    "Variable5":"Value5"
    }
    

    请求:

    Value4Variable="Value4"
    curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" \
    -d @<(sed "s/\$Value4Variable/$Value4Variable/" json-data-file) \
    https://www.hashemian.com/tools/form-post-tester.php/test123
    

    输出:

    The POSTed value is:
    
    ********************
    
    {"Variable1":"Value1", "Variable2":"Value2's","Variable3":"Value3","Variable4":"'Value4'", "Variable5":"Value5"}
    
    ********************
    
    Results saved to: test123
    *Note: Results are purged periodically. 1 hr minimum life.
    
    • 1
  3. Kusalananda
    2021-08-08T11:33:44+08:002021-08-08T11:33:44+08:00

    考虑使用 JSON 感知工具来创建 JSON 文档。这样做将消除手动转义特殊字符(如制表符、换行符、双引号等)的需要。单引号实际上是不需要在 JSON 中转义的字符。你只需要确保你使用正确的引号让 shell 正确识别你的字符串。

    这里的jo工具使从命令行创建 JSON 文档变得非常容易:

    somevariable2='line1
    line2
    line3'
    
    curl -s -X POST \
        -H 'Content-Type: application/json' \
        -H 'Accept: application/json' \
        -d "$( jo \
            variable1="Value1" \
            variable2="$somevariable2" \
            variable3='String with "quotes"' \
            variable4="It's raining!" \
            variable5='\/\/\/\/\/' )" \
        'https://www.hashemian.com/tools/form-post-tester.php'
    

    或者

    somevariable2='line1
    line2
    line3'
    
    jo \
        variable1="Value1" \
        variable2="$somevariable2" \
        variable3='String with "quotes"' \
        variable4="It's raining!" \
        variable5='\/\/\/\/\/' |
    curl -s -X POST \
        -H 'Content-Type: application/json' \
        -H 'Accept: application/json' \
        -d @- \
        'https://www.hashemian.com/tools/form-post-tester.php'
    

    任何一段代码的响应都是

    The POSTed value is:
    
    ********************
    
    {"variable1":"Value1","variable2":"line1\nline2\nline3","variable3":"String with \"quotes\"","variable4":"It's raining!","variable5":"/\\/\\/\\/\\/"}
    
    ********************
    
    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve