【问题标题】:Bash Script single quotes inside of double quotes inside of single quotesBash Script 单引号内的双引号内的单引号内
【发布时间】:2019-04-08 19:12:37
【问题描述】:

是的,这有点搞砸了,但我必须执行以下操作(这只是一个简化的示例):

sudo -H -u user1 bash -c ‘ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com “find ./ -name ‘*.txt’”’

我需要在单引号内的双引号内加上单引号。似乎标准的'"'"' 不起作用,因为双打会关闭双打而不是引用单打。会不会是:"'"'""' 里面我需要的每一个单曲?

我尝试在 ssh 命令周围跳过',但当然失败了。

【问题讨论】:

  • 首先将'(开引号)和'(闭引号)字符更改为'(单引号)。对“和”执行相同的操作到“(双引号)。看起来您使用 MS-Word 之类的文本编辑器编辑 bash 脚本,其行为是将引号对更改为开始和结束引号。跨度>
  • 其次,用 \(反斜杠)转义引号内的引号,就像下面 chepner 所说的那样。
  • 标准 '"'"' 在这里可以工作——当第一级引号被解析时,双引号(在单引号内)不被认为是重要的,它们只是另一个字符恰好在带引号的字符串中。您可以使用printf '%s\n' 'ssh ... "find ./ -name '"'"'*.txt'"'"'"' 对此进行测试(即查看在一级解析和引号删除后命令的外观)

标签: bash


【解决方案1】:

您不需要bash -c 层;直接从sudo 运行ssh 本身。

sudo -H -u user1 ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com "find ./ -name \"*.txt\""

(-I 选项应该是不必要的;如果ssh 以user1 运行,那么默认密钥是~user1/.ssh/id_rsa。无论如何你可能是指-i;-I 指定一个PKCS#11要使用的库,而不是私钥。)

也就是说,您不能在单引号字符串中包含单引号。如有疑问,请使用双引号,并正确转义任何嵌套的双引号。

【讨论】:

  • 抱歉,需要 bash -c。我要从一个 unix 盒子到一个运行 cygwin ssh 服务器的绕线器盒子。
  • bash -c 在本地运行;远程主机上的操作系统与此有什么关系?
  • 老实说,我不知道。它可以与 bash -c 一起使用,但如果没有 bash -c 则无法使用
  • 将此标记为解决方案。我不得不保留 bash -c,但是在双打和单打内使用转义双打效果很好。谢谢!!!
  • 那么您实际运行的是什么命令,因为您问题中的命令不需要bash。
【解决方案2】:

chepner 的回答就足够了。 如果需要bash -c,可以使用这个看起来凌乱的解决方案:

sudo -H -u user1 bash -c 'ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com "find ./ -name '"'"'*.txt'"'"'"'

解释

'... "find ./ -name '[first ' ended here]  "'" [second ' quote start]  '*.txt'[pattern]  "'"[second ' end] '"'[ " ended here]

我将‘ 替换为'。

【讨论】:

  • 这给了我:-bash-4.2$ ./test.sh '.txt": -c: 第 0 行:在寻找匹配的 `"' 时出现意外的 EOF ' .txt": -c: 第 1 行:语法错误:文件意外结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2016-12-17
  • 2013-02-05
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多