14

我正在尝试执行 if/then 语句,如果ls | grep something命令有非空输出,那么我想执行一些语句。我不知道我应该使用的语法。我尝试了几种变体:

if [[ `ls | grep log ` ]]; then echo "there are files of type log";
4

3 回答 3

27

好吧,这很接近,但你需要完成ifwith fi

此外,if如果命令成功(以状态码 0 退出),只需运行命令并执行条件代码,这grep仅在找到至少一个匹配项时才会执行。所以你不需要检查输出:

if ls | grep -q log; then echo "there are files of type log"; fi

grep如果您使用的是不支持("quiet") 选项的旧版本或非 GNU 版本的系统,则-q可以通过将其输出重定向到/dev/null

if ls | grep log >/dev/null; then echo "there are files of type log"; fi

但是由于ls如果它没有找到指定的文件也会返回非零,你可以在没有的情况下做同样的事情grep,就像在 D.Shawley 的回答中一样:

if ls *log* >&/dev/null; then echo "there are files of type log"; fi

您也可以只使用 shell 来完成它,甚至不使用ls,尽管它有点冗长:

for f in *log*; do 
  # even if there are no matching files, the body of this loop will run once
  # with $f set to the literal string "*log*", so make sure there's really
  # a file there:
  if [ -e "$f" ]; then 
    echo "there are files of type log"
    break
  fi
done 

只要您专门使用 bash,您就可以设置nullglob选项来简化它:

shopt -s nullglob
for f in *log*; do
  echo "There are files of type log"
  break
done
于 2012-04-29T14:00:06.397 回答
4

或没有if; then; fi

ls | grep -q log && echo 'there are files of type log'

甚至:

ls *log* &>/dev/null && echo 'there are files of type log'
于 2014-08-26T02:40:36.353 回答
1

if内置执行shell命令并根据命令的返回值选择块 。ls如果没有找到请求的文件,则返回一个不同的状态代码,因此不需要该grep部分。该[[ 实用程序实际上是来自 bash IIRC 的内置命令,用于执行算术运算。我在这方面可能是错的,因为我很少偏离 Bourne shell 语法。

无论如何,如果你把所有这些放在一起,那么你最终会得到以下命令:

if ls *log* > /dev/null 2>&1
then
    echo "there are files of type log"
fi
于 2012-04-29T14:03:44.457 回答