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 / 问题 / 670305
Accepted
s.k
s.k
Asked: 2021-09-24 05:18:11 +0800 CST2021-09-24 05:18:11 +0800 CST 2021-09-24 05:18:11 +0800 CST

在单引号子命令中转义单引号,本身在双引号命令中

  • 772

问题很简单如下:

watch "psql -d postgresql://user:pass@host:5432/dbname -c 'select id,name from table where name <> 'not available' order by id;'"

这个'not available'比较必须像Postgres 一样单引号。但是我无法找到正确转义这些单引号的方法,因为 psql 命令(我的意思是select...)本身已经是单引号,并且也在psqlfor watch 调用所需的双引号内。

如何解决这个问题?通过使用或使用多个双/单引号来转义这些单引号,
我几乎看到了所有可能的语法错误。\

bash ubuntu
  • 2 2 个回答
  • 625 Views

2 个回答

  • Voted
  1. Best Answer
    cas
    2021-09-24T05:30:34+08:002021-09-24T05:30:34+08:00

    您不能在单引号内转义单引号。但是,您可以使用以下方法伪造它:

    '\''
    

    解释:这是一个结束单引号(即结束当前引用),后跟一个转义单引号,然后再次开始单引号。它的工作原理与'a'b'c'(引用a然后未引用然后b引用c- 所有在一起,这只是abc......并且'a'\''b'只是a'b)

    watch "psql -d postgresql://user:pass@host:5432/dbname -c \
      'select id,name from table
       where name <> '\''not available'\''
       order by id;'"
    

    (添加换行符以提高可读性。无论有没有它们,sql 命令的工作方式都相同)


    注意:使用 postgres(或 sqlite 或 mysql 等)时,最好使用支持占位符的语言,因此您无需担心引用。他们的 CLI 非常适合交互式查询和一些脚本(在 SQL 中,而不是在 sh 中),但是从 sh 传递 sql 代码所需的嵌套引用很笨拙并且容易出错(并非不可能,只是比其他语言付出更多的努力)。

    例如在 perl DBI中(我没有包含任何样板登录内容,只是带有准备好的语句和占位符的选择):

    # you could use string literals, but i'll use some
    # variables for this example
    my $exclude = 'not available';
    my $sql = 'select id,name from table where name <> ? order by id';
    
    my $sth = $dbh->prepare($sql);
    $sth->execute($exclude);
    

    ?是一个占位符,DBI 将用您提供的任何值替换它 -如果需要,根据列的数据类型自动引用它。即只给它列的数据,让它担心引用和转义。

    顺便说一句,你可以有多个,你只需要以正确的顺序提供正确类型的参数。此外,一些 DBI 驱动程序 - 包括DBD::Pg - 允许您使用命名占位符:name或编号占位符,如$1, $2- 这些看起来相同,并且与 shell 位置参数大致相同,但它们不是,它们是占位符在 sql 语句中)

    my $sql = 'select id,name from table where name <> $1 order by id';
    

    对于不只是将数据和/或文件名输入其他程序并协调其他程序的执行的任何东西,shell 都是一种糟糕的语言。由于您必须对引用、空格、分词等问题付出的关心和关注,任何即使是中等复杂的东西都将成为 PITA。ssh在命令中或在find .. -exec sh -c '...' {} +命令和许多其他必须嵌套多级引号的情况下,您将遇到与嵌套引号相同的问题。

    • 2
  2. David
    2022-08-16T17:17:32+08:002022-08-16T17:17:32+08:00

    也可以使用heredoc并避免转义:

    psql  "postgresql://[email protected]:5432/db1" <<EOF 
    select id,name from table where name <> 'not available' order by id;
    EOF
    
    • 0

相关问题

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

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

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

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

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

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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