如何在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中做這些實在費勁。
不過這些應用場景也有限,通常我們還是建議分別寫在不同的文件裏相互調用,除非一些特殊的場景需要儘可能寫在同一個文件中的話,可以參考上面的寫法。