Linux Bash調(diào)用Python和Java代碼過(guò)程
一. 前提條件
PythonSource.py
- 目前大多數(shù)的Linux系統(tǒng)中都會(huì)預(yù)裝Python
- 部分使用Bash來(lái)實(shí)現(xiàn)比較麻煩的代碼,可以使用Python來(lái)實(shí)現(xiàn),然后使用Bash來(lái)調(diào)用即可。
import sys
# python代碼進(jìn)行計(jì)算
x = 10
# 打印需要被bash獲取的信息
print(x * 2)
"""
設(shè)置返回碼
成功返回 0
失敗返回 1
"""
sys.exit(0)
JavaSource.java
- Java并不是腳本語(yǔ)言,因此必須編譯之后才能被調(diào)用
public class JavaSource {
public static void main(String[] args) {
// 打印需要被Bash獲取的信息
int x = 10;
System.out.println(x * 2);
// 設(shè)置退出碼, 方便Bash獲取java程序的執(zhí)行結(jié)果
System.exit(0);
}
}
Windows上雖然無(wú)法直接使用Bash,但是基本上程序員的電腦上都會(huì)安裝Git,通過(guò)Git for Bash可以使用Bash,上述語(yǔ)言書寫的程序就可以通過(guò)Bash來(lái)直接雙擊.sh文件來(lái)執(zhí)行了。
二. Bash代碼實(shí)現(xiàn)
2.1 命令與路徑判斷部分
#!/usr/bin/env bash
# 判斷java命令是否被安裝
if ! command -v java >/dev/null 2>&1; then
echo "【java】命令并沒(méi)有被安裝, 請(qǐng)確認(rèn)!"
exit 1
fi
# 判斷python命令是否被安裝
if ! command -v python >/dev/null 2>&1; then
echo "【python】命令并沒(méi)有被安裝, 請(qǐng)確認(rèn)!"
exit 1
fi
# 獲取當(dāng)前腳本的絕對(duì)路徑
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根據(jù)腳本的絕對(duì)路徑獲取腳本所在目錄的絕對(duì)路徑
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
# 拼接python代碼所在的路徑
PYTHON_FILE_PATH="$SCRIPT_DIR/00-source/PythonSource.py"
# 拼接java代碼所在的路徑
JAVA_FILE_PATH="$SCRIPT_DIR/00-source/JavaSource.java"
2.2 調(diào)用Python代碼部分
# 在bash中調(diào)用python代碼, 獲取其輸出值和退出碼 python_result=$(python "$PYTHON_FILE_PATH") # 獲取退出碼必須要在獲取返回值之前, 否則echo命令打印了返回值之后, Bash捕獲的就不是python的退出碼而是echo命令的執(zhí)行狀態(tài)了 echo "Python程序的退出碼是: $?" # 獲取python的打印值 echo "Python程序的結(jié)果是: $python_result"
2.3 調(diào)用Java代碼部分
# 進(jìn)入 Java 文件所在目錄
# $(dirname $JAVA_FILE_PATH) → 獲取 Java 文件所在目錄
# pushd <dir> → 切換到指定目錄,同時(shí)把當(dāng)前目錄 壓入目錄棧
# >/dev/null → 屏蔽 pushd 輸出
# || exit 1 → 如果目錄不存在或切換失敗,退出腳本
pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1
# 編譯java代碼(指定使用UTF-8編譯, 防止windows中默認(rèn)使用GBK編碼)
# 編譯之后會(huì)在當(dāng)前目錄下生成一個(gè).class文件
javac -encoding UTF-8 "$JAVA_FILE_PATH"
if [ $? -ne 0 ]; then
echo "編譯失??!"
# popd → 從目錄棧彈出上一個(gè)目錄,并切換回去
# >/dev/null → 屏蔽輸出
popd >/dev/null
exit 1
fi
# 從絕對(duì)路徑中獲取java不帶后綴的文件名
JAVA_FILE_BASENAME=$(basename "$JAVA_FILE_PATH" '.java')
echo '____________________________________'
echo "$JAVA_FILE_PATH"
echo "$JAVA_FILE_BASENAME"
echo ' ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄'
# 執(zhí)行編譯后的java代碼
java_result=$(java "$JAVA_FILE_BASENAME")
echo "Java程序的退出碼是: $?"
# 獲取java的打印值
echo -e "java程序的結(jié)果是: $java_result\n"
# 刪除生成的.class文件
sleep 2
rm "${JAVA_FILE_BASENAME}.class"
# 返回到原目錄
popd >/dev/null
# 退出
read -p "→ 腳本執(zhí)行結(jié)束, 按任意鍵結(jié)束 . . . " -n1 -s
三. 重點(diǎn)語(yǔ)法解析
獲取當(dāng)前腳本的絕對(duì)路徑和腳本所在的目錄
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
移動(dòng)到指定目錄后,退回到原目錄
pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1 popd >/dev/null
java并不是腳本語(yǔ)言,必須先編譯才能使用
# 編譯.java文件為.class文件 javac -encoding UTF-8 "$JAVA_FILE_PATH" # 調(diào)用編譯好的文件,執(zhí)行java代碼 java_result=$(java "$JAVA_FILE_BASENAME")
阻塞窗口,讓使用者看到腳本執(zhí)行結(jié)束的信息提示。
-p "..."
在讀取輸入前,顯示提示信息。
-n1
只讀取 1 個(gè)字符 就結(jié)束輸入(而不是等用戶按回車)。
所以用戶按下任意鍵(比如 a、空格 等)就會(huì)立即繼續(xù)。
-s
silent 模式,輸入時(shí)不會(huì)在終端上顯示出來(lái)。
read -p "→ 腳本執(zhí)行結(jié)束, 按任意鍵結(jié)束 . . . " -n1 -s
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux安裝Jenkins步驟及各種問(wèn)題解決(頁(yè)面訪問(wèn)初始化密碼)
這篇文章主要介紹了Linux安裝Jenkins步驟及各種問(wèn)題頁(yè)面訪問(wèn)初始化密碼,需要的朋友可以參考下2019-12-12
linux修改root密碼和linux忘記root密碼后找回密碼的方法
這篇文章主要介紹了linux修改root密碼和linux忘記root密碼后找回密碼的方法,需要的朋友可以參考下2014-01-01
linux系統(tǒng)下載依賴部署環(huán)境出現(xiàn)死鎖問(wèn)題及解決
在Linux下載依賴失敗時(shí),可刪除鎖文件(如pip.lock)后輸入三行指令(如清理緩存、更新包列表、重新安裝)解決,需根據(jù)實(shí)際環(huán)境調(diào)整命令,并注意鎖文件刪除可能影響依賴版本一致性2025-09-09
一文教你如何監(jiān)控Kafka?Topic的生產(chǎn)者客戶端
Apache?Kafka?是現(xiàn)代分布式系統(tǒng)中廣泛使用的消息隊(duì)列和流處理平臺(tái),本文將詳細(xì)介紹如何通過(guò)命令行工具、JMX?監(jiān)控、日志分析等方法,全面掌握?Kafka?Topic?的生產(chǎn)者信息,需要的可以參考下2025-04-04
Linux PXE高效批量網(wǎng)絡(luò)裝機(jī)過(guò)程
PXE(預(yù)啟動(dòng)執(zhí)行環(huán)境)是一種網(wǎng)絡(luò)引導(dǎo)技術(shù),允許從遠(yuǎn)程服務(wù)器通過(guò)網(wǎng)絡(luò)下載引導(dǎo)鏡像來(lái)安裝操作系統(tǒng),本文介紹了PXE的優(yōu)點(diǎn)如規(guī)模化、自動(dòng)化和遠(yuǎn)程實(shí)現(xiàn),以及搭建PXE服務(wù)器的基本步驟,包括安裝和配置TFTP、DHCP服務(wù)2024-09-09

