根据命令返回结果做if判断

我希望执行一个shell命令,如果执行成功(返回0)就执行一个动作,使用if then的方法尝试如下:

if [ `lsmod | grep example_mod` && `cat /etc/example_mod.conf | grep example_mod_version=XYZ` ]; then touch /tmp/example_mod; fi

目的是判断是否有内核模块以及从配置文件中查询是否有对应XYZ的版本,如果有则touch一个开关文件方便后续处理。

但是发现报错

-bash: [: missing `]'

这个报错参考 How to conditionally do something if a command succeeded or failed ,原来执行命令返回结果作为条件判断是不需要加 [] 的,[就是表示test指令(另外半边]只是为了配对,不用也可以)。

也就是说,如果你是判断一个文件或这目录是否存在,实际上就是隐含使用了 test 指令去检查文件是否存在,此时就需要使用 [ ,例如:

if [ -d /etc/kubernetes ] && [ -f /usr/sbin/kubelet ]; then
    echo "system has installed kubelet"
else
    echo "system without kubelt"
fi

但是,如果你是检查命令执行是否成功,则不要加 [,例如:

if kubelet info ; then
    echo "kubelet exceed success"
else
    else

另外常用的方式

rm -rf somedir || exit_on_error "Failed to remove the directory"

这样执行命令出错就会有提示信息

正确的命令是

if (lsmod | grep example_mod && cat /etc/example_mod.conf | grep example_mod_version=XYZ); then touch /tmp/example_mod; fi

这里if条件中不使用()也可以,加上是看上去清晰一些。

参考

Last updated