Linux Bash调用Python和Java代码过程
作者:fengyehongWorld
本文介绍了如何在Linux和Windows系统中使用Bash调用Python和Java程序,并详细解释了Bash脚本中的命令与路径判断、调用Python和Java代码以及重点语法解析
一. 前提条件
PythonSource.py
- 目前大多数的Linux系统中都会预装Python
- 部分使用Bash来实现比较麻烦的代码,可以使用Python来实现,然后使用Bash来调用即可。
import sys
# python代码进行计算
x = 10
# 打印需要被bash获取的信息
print(x * 2)
"""
设置返回码
成功返回 0
失败返回 1
"""
sys.exit(0)
JavaSource.java
- Java并不是脚本语言,因此必须编译之后才能被调用
public class JavaSource {
public static void main(String[] args) {
// 打印需要被Bash获取的信息
int x = 10;
System.out.println(x * 2);
// 设置退出码, 方便Bash获取java程序的执行结果
System.exit(0);
}
}
Windows上虽然无法直接使用Bash,但是基本上程序员的电脑上都会安装Git,通过Git for Bash可以使用Bash,上述语言书写的程序就可以通过Bash来直接双击.sh文件来执行了。
二. Bash代码实现
2.1 命令与路径判断部分
#!/usr/bin/env bash
# 判断java命令是否被安装
if ! command -v java >/dev/null 2>&1; then
echo "【java】命令并没有被安装, 请确认!"
exit 1
fi
# 判断python命令是否被安装
if ! command -v python >/dev/null 2>&1; then
echo "【python】命令并没有被安装, 请确认!"
exit 1
fi
# 获取当前脚本的绝对路径
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根据脚本的绝对路径获取脚本所在目录的绝对路径
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 调用Python代码部分
# 在bash中调用python代码, 获取其输出值和退出码 python_result=$(python "$PYTHON_FILE_PATH") # 获取退出码必须要在获取返回值之前, 否则echo命令打印了返回值之后, Bash捕获的就不是python的退出码而是echo命令的执行状态了 echo "Python程序的退出码是: $?" # 获取python的打印值 echo "Python程序的结果是: $python_result"
2.3 调用Java代码部分
# 进入 Java 文件所在目录
# $(dirname $JAVA_FILE_PATH) → 获取 Java 文件所在目录
# pushd <dir> → 切换到指定目录,同时把当前目录 压入目录栈
# >/dev/null → 屏蔽 pushd 输出
# || exit 1 → 如果目录不存在或切换失败,退出脚本
pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1
# 编译java代码(指定使用UTF-8编译, 防止windows中默认使用GBK编码)
# 编译之后会在当前目录下生成一个.class文件
javac -encoding UTF-8 "$JAVA_FILE_PATH"
if [ $? -ne 0 ]; then
echo "编译失败!"
# popd → 从目录栈弹出上一个目录,并切换回去
# >/dev/null → 屏蔽输出
popd >/dev/null
exit 1
fi
# 从绝对路径中获取java不带后缀的文件名
JAVA_FILE_BASENAME=$(basename "$JAVA_FILE_PATH" '.java')
echo '____________________________________'
echo "$JAVA_FILE_PATH"
echo "$JAVA_FILE_BASENAME"
echo '‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾'
# 执行编译后的java代码
java_result=$(java "$JAVA_FILE_BASENAME")
echo "Java程序的退出码是: $?"
# 获取java的打印值
echo -e "java程序的结果是: $java_result\n"
# 删除生成的.class文件
sleep 2
rm "${JAVA_FILE_BASENAME}.class"
# 返回到原目录
popd >/dev/null
# 退出
read -p "→ 脚本执行结束, 按任意键结束 . . . " -n1 -s
三. 重点语法解析
获取当前脚本的绝对路径和脚本所在的目录
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
移动到指定目录后,退回到原目录
pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1 popd >/dev/null
java并不是脚本语言,必须先编译才能使用
# 编译.java文件为.class文件 javac -encoding UTF-8 "$JAVA_FILE_PATH" # 调用编译好的文件,执行java代码 java_result=$(java "$JAVA_FILE_BASENAME")
阻塞窗口,让使用者看到脚本执行结束的信息提示。
-p "..."
在读取输入前,显示提示信息。
-n1
只读取 1 个字符 就结束输入(而不是等用户按回车)。
所以用户按下任意键(比如 a、空格 等)就会立即继续。
-s
silent 模式,输入时不会在终端上显示出来。
read -p "→ 脚本执行结束, 按任意键结束 . . . " -n1 -s
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
