如何在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

掌握了这两种写法,就可以在pythonshell中反复横跳实现各种功能。频繁调用系统命令用shell,复杂的功能逻辑直接用python搞定,比如什么修改配置文件啊之类的。在shell中做这些实在费劲。

不过这些应用场景也有限,通常我们还是建议分别写在不同的文件里相互调用,除非一些特殊的场景需要尽可能写在同一个文件中的话,可以参考上面的写法。