在嵌套的 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
我仍在寻找 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