我正在启用VM上的防火墙。 最初,防火墙处于屏蔽状态。 我使用两个功能
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状态防火墙d
答案 0 :(得分:6)
首先,通过使用返回值而不是写入标准输出来简化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
}