如何解决IF 语句与逻辑运算符未按预期工作
我正在编写一个简单的函数来检查三个不同的文件是否存在,如果所有三个文件都存在,它应该返回“是”,如果一个或多个文件存在则返回“部分”,如果三个文件都不存在则返回“否”。
该函数名为 IsPortalDown,它有一个大小写开关; NodeOne 是目前使用的那个。
这是我的功能
function IsPortalDown() {
case "$1" in
NodeOne )
if [[ -f $wpsdmgr ]] && [[ -f $wpsnodeagent ]] && [[ ! -f $wpsserver ]];
then
echo "Yes"
elif [[ ! -f $wpsdmgr ]] || [[ ! -f $wpsnodeagent ]] || [[ ! -f $wpsserver ]];
then
echo "Partially"
else
echo "No"
fi;
;;
NodeTwo )
;;
esac
}
定义了一些常量来清理一些东西。见下文
PortalProfileLogsDir=/opt/IBM/WebSphere/wp_profile/logs
WPSDMGRProfileLogsDir=/opt/IBM/WebSphere/AppServer/profiles/dmgr01/logs
wpsdmgr=$WPSDMGRProfileLogsDir/dmgr/dmgr.pid
wpsnodeagent=$PortalProfileLogsDir/nodeagent/nodeagent.pid
wpsserver=$PortalProfileLogsDir/WebSphere_Portal/WebSphere_Portal.pid
IsPortalDown NodeOne
[wpssrvr@tstdydalbpt0101 dmgr]$ IsPortalDown NodeOne
Yes
[wpssrvr@tstdydalbpt0101 dmgr]$ IsPortalDown NodeOne
Partially
[wpssrvr@tstdydalbpt0101 dmgr]$ IsPortalDown NodeOne
No
我现在的问题是,如果三个文件之一或所有三个文件都不存在,我会不断得到 Yes 而不是 Partially。
感谢任何帮助。谢谢
解决方法
这可能会稍微简化逻辑:计算存在的文件数:
nfiles=0
for file in "$wpsdmgr" "$wpsnodeagent" "$wpsserver"; do
[[ -f $file ]] && ((++nfiles))
done
case $nfiles in
3) echo Yes ;;
0) echo No ;;
*) echo Partially ;;
esac
,
你的 if
逻辑完全错误。把它放在你的函数中:
local result=(No Partially Partially Yes) i= c=
for i in file1 file2 file3; do
[[ -f "$i" ]] && ((c++))
done
echo "${result[c]}"
请记住,对于(现有)目录、设备文件等,-f
失败。请考虑使用 -r
(可读)还是 -e
(存在)更合适。
您还可以选择以下选项之一,以适当地返回函数的成功(零)或失败(非零)(我都测试过):
# If at least one exists,return 0 (success),otherwise return 1 (failure).
(($c)); return $?
# If all exist,return 0,otherwise return 1.
return $(( -( (c-5) / (c-4) - 2) ))
# Similar to above,but return the number of files that didn't exist (0 = success).
return $((3-c))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。