# Zsh, or Bash with failglob set
if (echo *log*) >&/dev/null; then
echo "there are files of type log"
fi
也可以设置为nullglob:
# with 'nullglob' set, in either Bash or Zsh
for f in *log*; do
echo "There are files of type log"
break
done
在Ksh或Bash中,如果没有设置任何选项,则需要更多的工作:
# Ksh or Bash without failglob or nullglob
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
3条答案
按热度按时间knpiaxh11#
很接近了,但是你需要用
fi
完成if
。此外,
if
只运行一个命令,如果命令成功(退出状态码为0),则执行条件代码,而grep
只有在找到至少一个匹配项时才执行条件代码。所以你不需要检查输出:如果您使用的是旧版或非GNU版本的
grep
,并且不支持-q
(“quiet”)选项,您可以通过将其输出重定向到/dev/null
来实现相同的结果:在这种情况下,你可以完全不使用
grep
,因为如果ls
没有找到指定的文件名,它将返回非零值,就像D.Shawley的回答一样:但在Zsh或设置了
failglob
选项的Bash中,如果通配符不匹配任何东西,这样的命令将出错,而无需实际运行ls
。您可以利用该行为进行检查,而根本不需要ls
:也可以设置为
nullglob
:在Ksh或Bash中,如果没有设置任何选项,则需要更多的工作:
7ivaypg92#
如果没有
if; then; fi
:或者甚至:
4zcjmb1e3#
if
内置执行shell命令,并根据命令的返回值选择块。如果ls
没有找到请求的文件,则返回一个不同的状态码,因此不需要grep
部分。[[
utility 实际上是bash中的一个内置命令IIRC,用于执行算术运算。我可能是错的,因为我很少偏离伯恩shell语法。无论如何,如果你把所有这些放在一起,那么你最终会得到以下命令: