我试图通过终端给我的python程序一个参数。为此,我使用以下几行代码:
import sys
something = sys.argv[1]现在,我尝试通过bash终端输入一个类似以下内容的字符串:
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特殊字符。怎样才能完全按原样使用字符串呢?
发布于 2019-05-08 13:45:03
您可以使用cat和一个here文档将原始字符串放入文件中,例如,如下所示。
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然后运行
python my_script.py "$(< file.txt)"如果您愿意,也可以在第一步中使用您选择的文本编辑器。
如果这是一个重复出现的任务,你必须时不时地执行,你可以在shell中使用一个小别名来让你的生活变得更容易:
alias escape='read -r string ; printf "Copy this:\n%q\n" "${string}"'它使用printf "%q"对输入字符串进行转义。
像这样运行它:
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中直接使用转义字符串,而不需要额外的引号,如下所示:
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发布于 2019-05-08 13:38:09
为了使工作更轻松,像bash这样的shells会做一些额外的工作,帮助用户将正确的参数传递给他们指示执行的程序。这种额外的工作通常会导致可预测的参数数组被传递给程序。
然而,这种额外的帮助通常会导致意外的参数传递给程序;有时还会导致执行不需要的额外命令。但是,在本例中,它最终导致Bash发出一个错误。
为了关闭这项额外的工作,Bash允许用户通过用引号将参数括起来来指示参数应该从哪里开始和从哪里结束。Bash支持使用单引号(')和双引号(")来分隔参数。最后,如果字符串可能包含单引号和双引号(或者需要双引号,但不够激进),Bash允许您通过在相邻参数前面加上反斜杠(\\)来指示特殊字符或空白字符应该是相邻参数的一部分。
如果这种转义参数的方法过于繁琐,那么通过让程序使用来自文件而不是命令行参数的数据来简化程序界面可能是值得的。另一种选择是创建一个程序,该程序从更受控制的位置(如文件)加载参数,并使用所需的参数数组直接exec目标程序。
https://stackoverflow.com/questions/56033856
复制相似问题