У меня есть это
python -c "import sys, urllib as ul; \
print ul.quote('sample hihi ')"
Как может я переносить его в функцию удара, таким образом, я могу назвать его как функция как так:
urlencode('sample hihi ')
Спасибо
Необходимо передать аргументы функции в код 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...
Примечание: Непосредственно никогда не вводите аргументы оболочки в свою строку кода Python, как python -c "print('$x')"
, поскольку это могло привести к легко годным для использования угрозам безопасности, если Вы когда-нибудь планируете выполнить свою функцию на недоверяемом входе, позволяя людям выполнить произвольные команды!
Взгляните на этот пример оболочки, где я разрабатываю аргумент в переменной x
способом выполнять системную команду uname
(который безопасен и просто печатает "Linux", но можно сделать все здесь):
$ x="');import os;os.system('uname');('"
$ python3 -c "print('$x')"
Linux