【问题标题】:Bash escaping quotesBash 转义引号
【发布时间】:2016-07-08 05:29:39
【问题描述】:

我正在通过 SSH 在屏幕上执行一些命令。这非常有效:

ssh myuser@mydomain.com "screen -list; screen -r -d -X -S myscreen stuff $'echo here\n'"

但现在我尝试运行包含双引号的 sed 命令,而不是 echo。

sed -i -r "s/(    host: )(\w+)/\1test/" file.yml

双引号导致 bash: syntax error near unexpected token `database_name:'

如何正确转义 sed 所需的双引号?

【问题讨论】:

  • 为什么需要双引号?这应该与您的 sed 命令周围的单引号一起使用。您没有任何想要扩展的内容。
  • 单引号会干扰 stuff 命令周围的单引号。我正在尝试用 sed 命令替换此处的 echo。
  • 您可以使用'\''在其他单引号内“引用”单引号。
  • 尝试将此处文档中的远程命令提供给ssh,而不是作为引用的命令行参数。它将为您节省一定程度的报价。

标签: bash sed scripting automation


【解决方案1】:

我发现最简单的方法是将其分解为两个命令。

首先将命令发送到屏幕。使用反斜杠转义 stuff 命令中的任何双引号。

ssh myuser@mydomain.com 'screen -list; screen -r -d -X -S myscreen stuff "sed -i -r \"s/(    host: )(\w+)/\1test/\"" file.yml'
                        └────────────────────────────────────────────────────────────────────────────────────────────┘
                                                                         └──────────────────────────────────────┘

然后发送返回执行命令。注意使它执行的 $。

ssh myuser@mydomain.com "screen -list; screen -r -d -X -S myscreen stuff $'\n'"
                        └─────────────────────────────────────────────────┘
                                                                          └──┘

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2017-08-05
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多