尽管手动执行时条件为真,但 if 条件始终为假

尽管手动执行时条件为真,但 if 条件始终为假

我希望搜索一个字符串mongo,而不是以#文件中的注释开头。

homedir=`ls -d ~`

echo "$homedir"

if [[ `cat $homedir/2_need_softwares.txt | grep -v '^#' | grep -iq mongo` ]]; then

echo "Installing mongodb"

else

echo "skipping mongo"

fi

输出:

/root
skipping mongo

我上线了centos 9

$ uname -a
Linux DKERP 5.14.0-134.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 21 12:57:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

正如您所看到的,该if语句失败,因此else被执行。

但是当我手动运行 if 条件时它显示成功

$ cat /root/2_need_softwares.txt | grep -v '^#' | grep -iq mongo
$ echo $?
0

$ grep mongo /root/2_need_softwares.txt
mongo

您能建议我的if情况有什么问题吗?

我也尝试了以下方法:

1. if [[ $(cat $homedir/2_need_softwares.txt | grep -v '^#' | grep -iq mongo) ]]; then

2. if [[ $("cat $homedir/2_need_softwares.txt | grep -v '^#' | grep -iq mongo") ]]; then

这是为了bash并且POSIX是优选的。

答案1

问题是您正在测试命令序列的输出而不是状态。

试试这个

#!/bin/sh
if grep -v '^#' "$HOME/2_need_softwares.txt" | grep -iq mongo
then
    echo "Installing mongodb"
else
    echo "skipping mongo"
fi

相关内容