Ric*_*ckD 6 python bash shell quoting
我现在有
".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?!$)', r'\1.', "00112233")).split('.')])
'xx.xx.xx.xx'
Run Code Online (Sandbox Code Playgroud)
哪个有效,但当我尝试通过python -c开关使用它失败了?
[root@monty ~]# python -c "import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?!$)', r'\1.', "00112233")).split('.')])"
python -c "import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?"import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?python)', r'\1.', "00112233")).split('.')])")', r'\1.', "00112233")).split('.')])"
-bash: syntax error near unexpected token `str'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
看起来像命令行上的引用问题.
尝试用单引号包装Python字符串,而不是在其中使用单引号.
您还可以使用跳过与shell解释冲突的引号\".
$ python -c 'import re;print ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r"(.{2})(?!$)", r"\1.", "00112233")).split(".")])'
0.17.34.51
Run Code Online (Sandbox Code Playgroud)
注意:由于您不再运行python解释器,因此需要明确打印结果.
用带引号的heredoc输入脚本,而不要使用python -c,这样就可以完整解决问题。同样,这使您可以在代码中使用换行符,因此可读性更高。
python - <<'EOF'
import re
print ".".join(str(z) for z in [int(x, 16)
for x in (re.sub(r'(.{2})(?!$)',
r'\1.',
"00112233")).split('.')])
EOF
Run Code Online (Sandbox Code Playgroud)
请注意,必须使用<<'EOF'而不是<<EOF此处。前者阻止shell尝试扩展Heredoc的内容。
如果您真的想使用python -c,那么该方法仍然可以从用来将脚本捕获到变量中的heredoc中受益:
python_script=$(cat <<'EOF'
import re
print ".".join(str(z) for z in [int(x, 16)
for x in (re.sub(r'(.{2})(?!$)',
r'\1.',
"00112233")).split('.')])
EOF
)
python -c "$python_script"
Run Code Online (Sandbox Code Playgroud)