Bash脚本单引号内的双引号内的单引号

Bash脚本单引号内的双引号内的单引号,bash,Bash,是的,这有点混乱,但我必须做如下的事情(这只是一个简单的例子): sudo-H-u user1bash-c'ssh-I/home/user1/.ssh/id\u rsa-fuser2@machine1.domain1.com“查找./-name'*.txt'” 我有一个需要有一个单引号内的双引号,这是在单引号内。标准的“似乎不起作用,因为双打将关闭双打,而不是引用单打。可能是:“我需要的每一张都在里面 我尝试跳过ssh命令周围的,,但当然失败了。您不需要bash-c层;只需从sudo直接运行ss

是的,这有点混乱,但我必须做如下的事情(这只是一个简单的例子):

sudo-H-u user1bash-c'ssh-I/home/user1/.ssh/id\u rsa-fuser2@machine1.domain1.com“查找./-name'*.txt'”

我有一个需要有一个单引号内的双引号,这是在单引号内。标准的
似乎不起作用,因为双打将关闭双打,而不是引用单打。可能是:
我需要的每一张都在里面


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

您不需要
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\u rsa
。您可能是指
-I
无论如何;
-I
指定要使用的PKCS 11库,而不是私钥。)


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

您不需要
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\u rsa
。您可能是指
-I
无论如何;
-I
指定要使用的PKCS 11库,而不是私钥。)


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

切普纳的答案就足够了。 如果需要
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-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]

我将
替换为

首先将“(开始引号)和“(结束引号)字符更改为“(单引号)。对“and”into(双引号)也要这样做。它看起来像是用MS Word这样的文本编辑器编辑bash脚本,其行为是将引号对更改为开始引号和结束引号。其次,用\(反斜杠)转义引号内的引号,如chepner所说。标准的
“”“
在这里可以使用——当解析第一级引号时,双引号(在单引号中)不被认为是重要的,它们只是引号字符串中的另一个字符。您可以使用
printf“%s\n”ssh测试这一点(即,在一个级别的解析和引号删除之后,查看命令的外观)。。。“find./-name''''''*.txt''''''''''”
首先将“(开始引号)和“(结束引号)字符更改为“(单引号)。对“and”into(双引号)也要这样做。它看起来像是用MS Word这样的文本编辑器编辑bash脚本,其行为是将引号对更改为开始引号和结束引号。其次,用\(反斜杠)转义引号内的引号,如chepner所说。标准的
“”“
在这里可以使用——当解析第一级引号时,双引号(在单引号中)不被认为是重要的,它们只是引号字符串中的另一个字符。您可以使用
printf“%s\n”ssh测试这一点(即,在一个级别的解析和引号删除之后,查看命令的外观)。。。“find./-name''''''*.txt'''''''''''''''''''''''''''''''''''''./code>这给了我:-bash-4.2$./test.sh'.txt:-c:第0行:在查找匹配'''''''.txt'时出现意外的EOF:-c:第1行:语法错误:文件意外的结尾这给了我:-bash-4.2$./test.sh'.txt:-c:第0行:在查找匹配''''.'.':-c:第1行:语法错误:文件意外结束,需要bash-c。我将从一个运行cygwin ssh服务器的unix机器变成一个winders机器。
bash-c
在本地运行;远程主机上的操作系统与此有什么关系?老实说,我不知道。它与bash-c一起工作,但如果没有bash-c将其作为解决方案,它就无法工作。我不得不保留bash-c,但在双打和单打中使用转义双打效果很好。谢谢那么您实际运行的是什么命令,因为您所问的那个命令不需要bash。我将从一个运行cygwin ssh服务器的unix机器变成一个winders机器。
bash-c
在本地运行;远程主机上的操作系统与此有什么关系?老实说,我不知道。它与bash-c一起工作,但如果没有bash-c将其作为解决方案,它就无法工作。我不得不保留bash-c,但在双打和单打中使用转义双打效果很好。谢谢那么您实际运行的是什么命令,因为您问题中的命令不需要
bash