linux - 正确捕获退出代码并在故障点退出脚本
问题描述
我有下面的代码块bash
。exit
每当出现故障但无法这样做时,我都会尝试编写脚本。
#!/bin/bash
jarFilePath=/usr/jars
username=test_user
password=password
host=10.10.10.10
val_query="SELECT * FROM test_db.test_table"
echo "${val_query}"
content=$(java -jar ${jarFilePath} -u ${username},${password} -n ${host} -c "${val_query}")
if ! $content; then
echo "Problem in executing query"
exit 201
fi
touch /home/$username/script_passed.txt
当我传递错误的凭据时,脚本将失败。错误如下
SQLException: [10]: authentication failed
这是预期的,但脚本不会在此错误消息处终止。它正在执行touch
命令
我在这里做错了什么以及如何在失败时退出脚本
解决方案
大概 java 命令有一个非零退出状态,所以你会这样做:
content=$(java -jar ${jarFilePath} -u ${username},${password} -n ${host} -c "${val_query}")
rc=$?
if ((rc != 0)); then
echo "Problem in executing query"
exit 201
elif [[ -z $content ]]; then
echo "Empty results"
fi
请注意,该content
变量保存命令的输出,而不是退出状态。
if ! $content; then ...
将内容变量的值作为命令执行,如果该执行具有非零退出状态(来自!
),您将获得“真”分支。
推荐阅读
- ansible - Ansible AWX - 获取项目 url 和用户
- django - 当用户访问特定 URL 时更新 Django 对象
- c++ - 我应该如何解析和检查字符串?
- javascript - HTML / CSS - 根据屏幕宽度动态缩写文本
- sql - 如何删除 sqlite3 中单元格值末尾的多余空格?
- git - 如何使用 Libgit2sharp 确定文件是否为二进制文件?
- azure - 如何从 az cli 正确获取带有空格的 blob 名称
- unit-testing - 为 Camel 路由和处理器创建 JUnit
- c++ - 理解 bool operator==(paramater 1, parameter 2)
- java - 不能在java中使用另一个类的公共方法