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
。