如何在Shell脚本中嵌入Python
原shell脚本test.sh:
#!/bin/bash
function main()
{
echo "$@"
exit 0
}
main "$@"
./test.sh t1 t2 t3
执行结果:
username@Computer:~$ ./test.sh t1 t2 t3
t1 t2 t3
嵌入单行的python,比如切割个字符串啥的
#!/bin/bash
function main()
{
echo "$@"
# 最后那个"$@"是传递给python的参数
result=$(python3 -c 'import sys; print(sys.argv[1].split(","))' "$@")
echo "$result"
exit 0
}
main "$@"
./test.sh t1,t2,t3
执行结果:
username@Computer:~$ ./test.sh t1,t2,t3
t1,t2,t3
['t1', 't2', 't3']
其实就是直接调用python程序,程序的输出就相当于返回值可以传递给变量,这里直接赋值给result
,获取值用$()
可以,用``也可以。看上去好像有点复杂,其实和:result=$(echo 123)
是一个道理,只不过把echo 123换成了一行python脚本。如果只是让python实现一些功能,不关心返回值的话,完全可以不‘print’任何东西。
嵌入多行python:
#!/bin/bash
function getNum()
{
# "$@"是传递给python的参数 python3 - 相当于从标准输入读入。
python3 - "$@" <<END
#!/usr/bin/python3
import sys
if __name__ == "__main__":
print(len(sys.argv[1].split(",")))
END
}
function main()
{
echo "$@"
num=`getNum "$@"`
echo "arg number : $num"
exit 0
}
main "$@"
在两行END之间,可以像平时写大量的python代码。
需要注意的是,缩进的地方手动用空格缩进,否则会有违法缩进的问题。
./test.sh 123,123,123
执行结果:
username@Computer:~$ ./test.sh 123,123,123
123,123,123
arg number : 3
掌握了这两种写法,就可以在python
和shell
中反复横跳实现各种功能。频繁调用系统命令用shell,复杂的功能逻辑直接用python搞定,比如什么修改配置文件啊之类的。在shell中做这些实在费劲。
不过这些应用场景也有限,通常我们还是建议分别写在不同的文件里相互调用,除非一些特殊的场景需要尽可能写在同一个文件中的话,可以参考上面的写法。