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

时间:2015-01-28 05:11:29

标签: bash if-statement grep

我仍然在寻找解决bash脚本问题的方法,所以请耐心等待。 目前我正在尝试编写一个检查服务器上的一些脚本的脚本。 检查后,看看GPU驱动程序是否是最新版本。

但是,无论服务器上安装的GPU驱动程序如何,脚本都会返回 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

2 个答案:

答案 0 :(得分:2)

您想测试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

答案 1 :(得分:0)

grep -q不会返回/打印任何内容。它实际上将返回值设置为0或1.您可以使用$?来检查它。所以if语句变得有效了

[ ! $() ]

$()始终返回false。这会导致您定义的行为。