bash - Bash 函数在 if ... 中返回值;然后声明
问题描述
我正在启用虚拟机上的防火墙。最初,防火墙处于屏蔽状态。我使用两个功能
function status_firewall() {
RET_VAL=" "
STATUS=$(systemctl status firewalld)
MASKED=$(grep -e "masked" <<< $STATUS)
M_RET=$?
DEAD=$(grep -e "dead" <<< $STATUS)
D_RET=$?
logging "M_RET and D_RET: $M_RET, $D_RET"
if [ "${M_RET}" -eq "0" ]; then
RET_VAL=1
elif [ "${D_RET}" -eq "0" ]; then
RET_VAL=2
else
RET_VAL=0
fi
echo ${RET_VAL}
}
如果防火墙被屏蔽,则 echo 语句打印值“1”
function check_firewall() {
FIREWALL=$(status_firewall)
logging "Firewall status in check_firewall: ${FIREWALL}"
if [ "$(status_firewall)" -eq "0" ]; then
logging "Firewalld service already running"
RET_VAL=0
elif [ "$(status_firewall)" -eq "1" ]; then
...
elif
...
fi
我得到了正确的 MASKED 和 DEAD 状态值 (0, 0) status_firewall() { ... } 但是,当检查 check_firewall() { .. } 中的返回值时,我得到以下整数错误:整数表达式预期
检查返回值时:check_firewall() 它列出: 防火墙状态: ● firewalld.service 已加载:屏蔽 (/dev/null) 活动:非活动(死)
为什么第一个函数应该返回值“1”但在第二个函数中它将返回值列为命令的输出:systemctl status firewalld
解决方案
首先,status_firewall
通过使用返回值而不是写入标准输出来简化,并在case
语句中使用模式匹配而不是调用grep
.
status_firewall() {
status=$(systemctl status firewalld)
case $status in
*masked*) rv=1 ;;
*dead*) rv=2 ;;
*) rv=0 ;;
esac
return $rv
}
然后 check_firewall
只是检查退出状态的问题status_firewall
。
check_firewall() {
status_firewall
case $? in
0) logging "Firewalld service already running" ;;
1) ... ;;
2) ... ;;
esac
}
实际上,您可以status_firewall
完全取消:
check_firewall() {
case $(systemctl status firewalld) in
*masked*) ... ;;
*dead*) ... ;;
*) logging "Firewalld service already running" ;;
esac
}
推荐阅读
- kubernetes - Kubernetes Cronjob:集群恢复后重置错过的开始时间
- c++ - 如何快速计算任何底的整数对数?
- angular - NG Bootstrap 封装问题
- sql-server - 关于 WHERE 子句的 SQL Server 语法?
- amazon-web-services - 将 Next.js 部署到 AWS Elastic Beanstalk 时出错
- excel - 如何在 oracle plsql 中使用一个包含多个表/数据透视表的工作表生成 excel 文件?
- python-sphinx - 包含没有引用(或引用前缀)的文件
- java - 如何在过滤器中获取 servlet 的元信息?
- python-3.x - 如何使用 elasticsearch-dsl-py 创建“In”条件过滤器?
- python-3.x - 字典中的列上的函数