我有这个
python -c "import sys, urllib as ul; \
print ul.quote('sample hihi ')"
我怎样才能将它包装到 bash 函数中,以便我可以像下面这样调用它:
urlencode('sample hihi ')
谢谢
答案1
您应该将函数参数作为常规 shell 参数传递到 Python 代码中,这些参数可以通过数组访问sys.argv
。在 Bash 函数中,可以通过 访问其调用参数,例如"$*"
,它将所有参数作为单个空格分隔的字符串参数返回(就像将其作为一个整体引用而不是单独的标记一样)。
以下是遵循原始代码的示例:
urlquote() { python -c 'import sys, urllib as ul; print ul.quote(sys.argv[1])' "$*" ;}
然而,由于 Python 2 支持即将结束,下面是更好的 Python 3 等效版本:
urlquote() { python3 -c 'import sys, urllib.parse as ul; print(ul.quote(sys.argv[1]))' "$*" ;}
两者的调用都是相同的,键入函数名称,然后是要编码的字符串作为参数。
$ urlquote "roses are red, violets are blue..."
roses%20are%20red%2C%20violets%20are%20blue...
笔记:永远不要将 shell 参数直接注入到你的 Python 代码字符串中,因为python -c "print('$x')"
如果你计划在不受信任的输入上运行你的函数,这可能会导致容易被利用的安全风险,允许人们运行任意命令!
看一下这个 shell 示例,我x
以一种方式在变量中制作参数来运行系统命令uname
(这无害并且只打印“Linux”,但您可以在这里做所有事情):
$ x="');import os;os.system('uname');('"
$ python3 -c "print('$x')"
Linux