如何在 Linux 上传递带有感叹号的参数?

Posted

技术标签:

【中文标题】如何在 Linux 上传递带有感叹号的参数?【英文标题】:How to pass argument with exclamation mark on Linux? 【发布时间】:2011-03-21 18:19:28 【问题描述】:

我有一个简单的 Python 脚本,它接收用户名和密码作为参数,但我的密码包含两个感叹号。当我调用我的脚本时

salafek@dellboy:~/Desktop/$ emailsender.py -u username -p pass!!

我之前输入的命令替换了感叹号:

salafek@dellboy:~/Desktop/$emailsender.py -u username -p "passemailsender.py -u username -p passwget wget http://www.crobot.com.hr/templog"

我可以使用反斜杠 (\) 转义感叹号,但我的密码会更改。

有没有解决办法,如何在不更改密码的情况下转义感叹号?

【问题讨论】:

第二个命令没有多大意义,你想在那里做什么?特别是passemailsender.py -u username -p passwget wget ... 部分 !!被shell替换,它被最后执行的命令替换。这不是特定于 python 的。 @Infinity - Bash 解释“!!”作为您输入的最后一个命令。因此,当他在没有使用单引号或反斜杠转义密码的情况下输入命令时,bash 会在“!!”的位置插入他的最后一个命令。是。 【参考方案1】:

正如其他人所提到的,此问题并非特定于 Python,而是由您将密码参数传递给脚本的方式引起的。

您需要将密码字符串用单引号括起来,以确保它完全按照您键入的方式传递给脚本,并且不会被 shell 解释。

如果用户名可能包含感叹号或其他特殊字符,您也可以这样做。

例如:

emailsender.py -u 'username' -p 'pass!!'

【讨论】:

【参考方案2】:

您需要使用\ 对其进行转义或使用单引号将其引用,否则您的shell 会解释它。

emailsender.py -u username -p pass\!\!

emailsender.py -u username -p 'pass!!'

【讨论】:

仅作记录,如果您没有双引号引用参数,则转义可以正常工作。否则,“\”将按字面意思写入文件。【参考方案3】:

您应该能够在 shell 中简单地将内容用单引号括起来。

$ emailsender.py -u username -p 'pass!!'

【讨论】:

以上是关于如何在 Linux 上传递带有感叹号的参数?的主要内容,如果未能解决你的问题,请参考以下文章

[Catel]如何将带有构造函数参数的 ViewModel 传递给 TabService 扩展方法?

如何在android中传递一个带有嵌套参数的RPC Json

从带有命令行参数的批处理文件运行控制台应用程序,如何在运行时传递参数值? [复制]

C#如何将带有感叹号图标注释的文本格式的数字转换为数字格式的数字?

如何将带有管道符号的多个参数传递到bash脚本案例语句中

在 Linux 中启动 GDB 时如何传递命令行参数? [复制]