我仍然在寻找解决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
答案 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。这会导致您定义的行为。