微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IF 语句与逻辑运算符未按预期工作

如何解决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 举报,一经查实,本站将立刻删除。