我正在尝试执行 if/then 语句,如果ls | grep something
命令有非空输出,那么我想执行一些语句。我不知道我应该使用的语法。我尝试了几种变体:
if [[ `ls | grep log ` ]]; then echo "there are files of type log";
我正在尝试执行 if/then 语句,如果ls | grep something
命令有非空输出,那么我想执行一些语句。我不知道我应该使用的语法。我尝试了几种变体:
if [[ `ls | grep log ` ]]; then echo "there are files of type log";
好吧,这很接近,但你需要完成if
with 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
或没有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'
if
内置执行shell命令并根据命令的返回值选择块 。ls
如果没有找到请求的文件,则返回一个不同的状态代码,因此不需要该grep
部分。该[[
实用程序实际上是来自 bash IIRC 的内置命令,用于执行算术运算。我在这方面可能是错的,因为我很少偏离 Bourne shell 语法。
无论如何,如果你把所有这些放在一起,那么你最终会得到以下命令:
if ls *log* > /dev/null 2>&1
then
echo "there are files of type log"
fi