如何通过';[单引号字符]作为linux[bash shell]中的参数?

如何通过';[单引号字符]作为linux[bash shell]中的参数?,bash,command-line-arguments,Bash,Command Line Arguments,我有一个abc.py文件,它接受参数-p[password]&-c[command]。 现在,我可以按如下方式运行此文件: ./abc.py -p 'a!s!d!f' -c 'ifconfig' ./abc.py -p 'a!s!d!f' -c './abc.py -p 'a!s!d!f' -c 'ifconfig'' a!sDf是我的密码。因为密码包含字符,因此我必须将其作为'中的参数发送。我试图将它发送到”,但没有成功 现在,我想按如下方式运行此代码: ./abc.py -p 'a!s!

我有一个
abc.py
文件,它接受参数
-p[password]
&
-c[command]
。 现在,我可以按如下方式运行此文件:

./abc.py -p 'a!s!d!f' -c 'ifconfig'
./abc.py -p 'a!s!d!f' -c './abc.py -p 'a!s!d!f' -c 'ifconfig''
a!sDf
是我的密码。因为密码包含
字符,因此我必须将其作为
'
中的参数发送。我试图将它发送到
,但没有成功

现在,我想按如下方式运行此代码:

./abc.py -p 'a!s!d!f' -c 'ifconfig'
./abc.py -p 'a!s!d!f' -c './abc.py -p 'a!s!d!f' -c 'ifconfig''
我给你的是
/abc.py-p'a!sDf'-c'ifconfig'
作为abc.py的参数

问题是,我无法将
字符作为参数发送到
abc.py

我需要将此
字符作为输入发送

我尝试将
\
转义字符用作:

./abc.py -p 'a!s!d!f' -c './abc.py -p \'a!s!d!f\' -c \'ifconfig\''

但不起作用。我该怎么做?任何帮助都将不胜感激。

您需要同时引用

./abc.py -p 'a!s!d!f' -c "./abc.py -p 'a!s!d!f' -c 'ifconfig'"

$ cat p.py
import sys
print sys.argv
在Korn shell:

$ python p.py -p 'a!s!d!f' -c "./abc.py -p 'a!s!d!f' -c 'ifconfig'"
['p.py', '-p', 'a!s!d!f', '-c', "./abc.py -p 'a!s!d!f' -c 'ifconfig'"]
在bash
仅在用单引号括起来时才被特殊处理,因此可以这样做:

$ python p.py -p 'a!s!d!f' -c './abc.py -p '"'"'a!s!d!f'"'"' -c config'
['p.py', '-p', 'a!s!d!f', '-c', "./abc.py -p 'a!s!d!f' -c config"]
请注意,使用双引号引用整个字符串时,结果不同:

$ python p.py -c "./abcy.py -p 'a\!s\!d\!f' -c 'ifconfig'"
['p.py', '-c', "./abcy.py -p 'a\\!s\\!d\\!f' -c 'ifconfig'"]
在Bash中(紧随其后),单引号按字面意思保留每个字符,这意味着无法转义单引号中的内容。你的选择是:

  • 通过将不同引号的字符串相邻放置来连接它们:

    ./abc.py -c "./abc.py -p '"'a!s!d!f'"' -c 'ifconfig'"
    
  • 使用双引号并转义
    字符:

    ./abc.py -c "./abcy.py -p 'a\!s\!d\!f' -c 'ifconfig'"
    

  • 这不是python的问题;这是一个shell引用问题。(在tcsh中,即使您的第一个示例也不起作用)。它给出了错误:-bash:!:事件未找到我的脚本使用paramiko SSH包在另一个VM上执行linux命令。因此,没有解决方案可以执行此操作吗?:-(当然有一个解决方案。当你的问题甚至没有说你正在使用哪个shell或者你收到了什么错误消息时,期待在不到10分钟内有一个是有点不耐烦的…(这可能属于超级用户)谢谢你的建议。我刚刚尝试了你的建议,但给了我以下错误:“-bash:!:未找到事件”。我在Korn shell中运行它,我会检查它在bash中的错误原因。我不是真的使用bash,我总是使用ksh,所以可能有一种更简单的方法引用带空格、单引号和感叹号的字符串,但我不知道。无论如何,单引号和双引号的组合是有效的。亲爱的,你绝对正确。.谢谢你努力回答这个问题。:-)你的第一个方法奏效了,兄弟。。。真的非常感谢……!:-)我只有18点声望。如果有办法转给你,那就告诉我。。我很乐意这样做…-)