在嵌套的 if 语句中使用 'grep'

Using 'grep' in nested if-statement

我仍在寻找 bash 编写脚本的方法,所以请多多包涵。 目前我正在尝试编写一个脚本来检查服务器上的一些。 一次检查是看GPU驱动有没有最新版本。

但是无论服务器上安装了 GPU 驱动程序,脚本 returns GPU 都没有升级

代码如下:

#!/bin/bash -x

######################################################
#GENERAL VARIABLES
GPU_DRIVER=270.41.19
######################################################

#Checking if Packsges are Installed

if [ $(uname -r) != $KERNEL_VERSION ]

then

echo "Kernel is not Upgraded"
#INSTALL KENRENL!
#REBOOT!
    else if [ ! $(nvidia-smi -q |grep -q $GPU_DRIVER) ]

    then

    echo "GPU is not Upgraded"

            else if [ $(cat /usr/ort/build_number) != $CODE_RELEASE ]

            then
            echo "Code Release526 Has not Been Installed"

            fi
    fi
fi

我想知道为什么if语句中的条件不适用?

注意: nvidia-smi 的输出类似于以下内容:

:~/script$ nvidia-smi -q|grep Driver
Driver Version                  : 270.41.19
Driver Model

grep -q 没有 return/print 任何东西。它实际上将 return 值设置为 0 或 1。您可以使用 $? 进行检查。如此有效,您的 if 语句变为

[ ! $() ]

$() return始终为假。这会导致您定义的行为。

您想测试 grep 是成功还是失败。这不需要 [...]$(...)。您只需要执行grep。与流行的看法相反,[ 不是 if 语句语法的一部分;它是一个 bash 命令,它根据条件表达式的评估成功或失败。 (通常,您会希望使用 [[,这是一个更好的条件求值器。)if 语句之后是一系列普通的 bash 语句;后跟关键字 then。如果最后一条语句成功,则采用 then 分支;否则采用 else 分支。

改变

else if [ ! $(nvidia-smi -q |grep -q $GPU_DRIVER) ]

elif ! nvidia-smi -q | grep -q -F "$GPU_DRIVER"; then

(并且 elif 将消除 fi 匹配 if 的需要。)

除了删除 test 内置 ([) 之外,我还修复了一些其他问题:

  • grep 通常期望模式是正则表达式。在正则表达式中,. 匹配任何字符。我认为您正在寻找精确匹配,所以我添加了 -F 标志。

  • 我在 $GPU_DRIVER 两边加上了引号,以防万一。

为了解释 if ... then ... elif ... fi 语法,这里是整个 if 语句:

if [[ $(uname -r) != $KERNEL_VERSION ]]; then
    echo "Kernel is not Upgraded"
    #INSTALL KENRENL!
    #REBOOT!
elif ! nvidia-smi -q |grep -q -F "$GPU_DRIVER"; then
    echo "GPU is not Upgraded"
elif [[ $(cat /usr/ort/build_number) != $CODE_RELEASE ]]; then
    echo "Code Release526 Has not Been Installed"
fi