小编典典

如何制作“如果不是真的条件”?

all

我希望在不正确echo时执行命令。cat /etc/passwd | grep "sysa"

我究竟做错了什么?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

阅读 60

收藏
2022-03-22

共1个答案

小编典典

尝试

if ! grep -q sysa /etc/passwd ; then

grep``true如果找到搜索目标,则返回,否则返回false

所以不是false== true

ifshell 中的评估被设计为非常灵活,并且很多时候不需要命令链(如您所写)。

此外,按原样查看您的代码,您$( ... )对 cmd-substitution 形式的使用值得称赞,但请考虑该过程的结果。试着echo $(cat /etc/passwd | grep "sysa")看看我的意思。您可以通过使用-cgrep 的 (count)
选项来进一步实现这一点,然后执行if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then该操作,但这是相当老派的。

但是,您可以使用最新的 shell 功能(算术评估),例如

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`

这也为您提供了使用基于 c-lang 的比较运算符的好处,==,<,>,>=,<=,%也许还有其他一些。

在这种情况下,根据 Orwellophile 的评论,算术评估可以进一步缩减,例如

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

要么

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

最后,还有一个 奖项 ,叫做Useless Use of Cat (UUOC). :-)
有些人会跳上跳下哭哥特卡!我只想说它grep可以在它的命令行上取一个文件名,那么为什么在你不需要的时候调用额外的进程和管道构造呢?;-)

我希望这有帮助。

2022-03-22