【问题标题】:how do I pass ' [single quote character] as argument in linux [bash shell]?如何在 linux [bash shell] 中传递 ' [单引号字符] 作为参数?
【发布时间】:2013-05-10 16:36:34
【问题描述】:

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

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

a!s!d!f 是我的密码。由于密码包含! 字符,所以我必须将其作为' ' 中的参数发送。我尝试发送到" ",但没有成功。

现在我想按如下方式运行这段代码:

./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 'ifconfig' 作为abc.py 的参数

问题是,我无法将' characher 作为参数发送给abc.py

我需要这个 ' 字符作为输入发送。

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

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

但不工作。我该怎么做呢?任何帮助将不胜感激。

【问题讨论】:

  • 这不是python问题;这是一个 shell 引用 问题。
  • (在 tcsh 中,即使您的第一个示例也不起作用)。
  • 它给出错误:-bash: !: event not found 我的脚本使用 paramiko SSH 包在另一个 VM 上执行 linux 命令。
  • 那么,没有解决办法吗? :-(
  • 当然有解决办法。当您的问题甚至没有说明您正在使用哪个 shell 或您收到什么错误消息时,期待在 10 分钟内获得一个有点不耐烦......(无论如何这可能属于超级用户)

标签: bash command-line-arguments


【解决方案1】:

你需要同时引用'!

./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 外壳中:

$ 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: !: event not found”。
  • 我在 Korn shell 中运行它,我会检查它为什么在 bash 中出错
  • 为 bash 添加了答案。我不是真的用bash,我总是用ksh,所以也许有更简单的方法用空格、单引号和感叹号来引用字符串,但我不知道。无论如何,单引号和双引号的组合是有效的。
  • 亲爱的你是绝对正确的。感谢您努力回答这个问题。 :-)
【解决方案2】:

在 Bash(在 POSIX shell standard 之后)中,单引号会按字面意思保留每个字符,这意味着无法转义单引号内的内容。您的选择是:

  1. 通过将不同引用的字符串放在一起来连接它们:

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

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

【讨论】:

  • 你的第一个方法奏效了兄弟...真的谢谢..! :-) 我只有 18 个声望点。如果有任何方法可以将其转让给您,请告诉我.. 很乐意这样做.. :-)
猜你喜欢
  • 2015-12-26
  • 2023-04-02
  • 2021-04-16
  • 2011-02-14
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多