如何制作"如果不是真实情况"?

San*_*ing 282 syntax bash if-statement boolean-expression

我想echocat /etc/passwd | grep "sysa"不正确时执行命令.

我究竟做错了什么?

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

she*_*ter 417

尝试

if ! grep -q sysa /etc/passwd ; then
Run Code Online (Sandbox Code Playgroud)

greptrue如果找到搜索目标,false则返回,如果没有,则返回.

所以NOT false== true.

if shell中的评估设计得非常灵活,很多时候不需要命令链(如你所写).

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

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

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
Run Code Online (Sandbox Code Playgroud)

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

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

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
Run Code Online (Sandbox Code Playgroud)

要么

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
Run Code Online (Sandbox Code Playgroud)

最后,有一个奖项称为Useless Use of Cat (UUOC).:-)有些人会跳起来,哭泣gothca!我只是说grep可以在其cmd行上获取文件名,那么为什么在不需要的时候调用额外的进程和管道结构?;-)

我希望这有帮助.

  • 不挑你的答案,很喜欢他们。我只是通过我会对用户名进行适当的有界检查,否则如果 OP 真的搜索“sys”或类似的东西,他会得到相当大的惊喜。一个多的道路?`(($( cat file | grep regex | wc -l ) ? 0 : 1 ))` (2认同)

Ron*_*ony 30

我认为它可以简化为:

grep sysa /etc/passwd || {
    echo "ERROR - The user sysa could not be looked up"
    exit 2
}
Run Code Online (Sandbox Code Playgroud)

或者在一个命令行中

$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }

  • 很好,但我更喜欢Mr. shellter的答案,因为是"自我记录",对程序员的意图更"可读". (3认同)
  • @ 0zkrPM但是shellter版本在Bourne shell中不起作用.你会得到`!:not found` (2认同)

Tar*_*req 9

这个

if [[ !  $(cat /etc/passwd | grep "sysa") ]]
Then echo " something"
exit 2
fi
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出。Stack Overflow 上不鼓励仅提供代码答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释此代码的作用以及它如何改进此问题已有的其他已投票答案,以便它对具有类似问题的其他用户有用。 (6认同)

phi*_*294 6

我究竟做错了什么?

$(...)保持价值,而不是退出状态,这就是为什么这种方法是错误的.但是,在这种特定情况下,它确实有效,因为sysa将打印使测试语句成为现实.但是,if ! [ $(true) ]; then echo false; fi将始终打印,false因为该true命令不会向stdout写入任何内容(即使退出代码为0).这就是它需要改写的原因if ! grep ...; then.

另一种选择cat /etc/passwd | grep "sysa" || echo error.编辑:亚历克斯指出,猫在这里没用:grep "sysa" /etc/passwd || echo error.

发现其他答案相当混乱,希望这有助于某人.


Mar*_*mbo 5

简单地:

if ! examplecommand arg1 arg2 ...; then
    #code block
fi
Run Code Online (Sandbox Code Playgroud)

没有任何括号。