首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过bash终端使用纯字符串作为python程序的参数

如何通过bash终端使用纯字符串作为python程序的参数
EN

Stack Overflow用户
提问于 2019-05-08 13:05:26
回答 2查看 54关注 0票数 0

我试图通过终端给我的python程序一个参数。为此,我使用以下几行代码:

代码语言:javascript
复制
import sys
something = sys.argv[1]

现在,我尝试通过bash终端输入一个类似以下内容的字符串:

代码语言:javascript
复制
python my_script.py 2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV

这将返回bash错误,因为字符串中的某些字符是bash特殊字符。怎样才能完全按原样使用字符串呢?

EN

回答 2

Stack Overflow用户

发布于 2019-05-08 13:45:03

您可以使用cat和一个here文档将原始字符串放入文件中,例如,如下所示。

代码语言:javascript
复制
cat <<'EOF' > file.txt
2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV
EOF

然后运行

代码语言:javascript
复制
python my_script.py "$(< file.txt)"

如果您愿意,也可以在第一步中使用您选择的文本编辑器。

如果这是一个重复出现的任务,你必须时不时地执行,你可以在shell中使用一个小别名来让你的生活变得更容易:

代码语言:javascript
复制
alias escape='read -r string ; printf "Copy this:\n%q\n" "${string}"'

它使用printf "%q"对输入字符串进行转义。

像这样运行它:

代码语言:javascript
复制
escape
2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV
Copy this:
2m+\{N7HiwH3\[\>\!\"4y\?t9\*y@\;/\$Ar3wF9+k\$\[3hK/WA=aMzF°L0PaZTM\]t\*P\|I_AKAqIb0O4@\ cm=sl\)WWYwEg10DDv%k/\"c\{LrS\)oVd§4\>8bs:\;9u\$\ \*W_SGk3CXe7hZMm\$nXyhAuHDi-q+ug5+%ioou.\,IhC\]-_O§V\]\^\,2q:VBVyTTD6\'aNw9:oan\(s2SzV

您可以在shell中直接使用转义字符串,而不需要额外的引号,如下所示:

代码语言:javascript
复制
python my_script.py 2m+\{N7HiwH3\[\>\!\"4y\?t9\*y@\;/\$Ar3wF9+k\$\[3hK/WA=aMzF°L0PaZTM\]t\*P\|I_AKAqIb0O4@\ cm=sl\)WWYwEg10DDv%k/\"c\{LrS\)oVd§4\>8bs:\;9u\$\ \*W_SGk3CXe7hZMm\$nXyhAuHDi-q+ug5+%ioou.\,IhC\]-_O§V\]\^\,2q:VBVyTTD6\'aNw9:oan\(s2SzV
票数 1
EN

Stack Overflow用户

发布于 2019-05-08 13:38:09

为了使工作更轻松,像bash这样的shells会做一些额外的工作,帮助用户将正确的参数传递给他们指示执行的程序。这种额外的工作通常会导致可预测的参数数组被传递给程序。

然而,这种额外的帮助通常会导致意外的参数传递给程序;有时还会导致执行不需要的额外命令。但是,在本例中,它最终导致Bash发出一个错误。

为了关闭这项额外的工作,Bash允许用户通过用引号将参数括起来来指示参数应该从哪里开始和从哪里结束。Bash支持使用单引号(')和双引号(")来分隔参数。最后,如果字符串可能包含单引号和双引号(或者需要双引号,但不够激进),Bash允许您通过在相邻参数前面加上反斜杠(\\)来指示特殊字符或空白字符应该是相邻参数的一部分。

如果这种转义参数的方法过于繁琐,那么通过让程序使用来自文件而不是命令行参数的数据来简化程序界面可能是值得的。另一种选择是创建一个程序,该程序从更受控制的位置(如文件)加载参数,并使用所需的参数数组直接exec目标程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56033856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档