San*_*ing 282 syntax bash if-statement boolean-expression
我想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
Run Code Online (Sandbox Code Playgroud)
she*_*ter 417
尝试
if ! grep -q sysa /etc/passwd ; then
Run Code Online (Sandbox Code Playgroud)
grep
true
如果找到搜索目标,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行上获取文件名,那么为什么在不需要的时候调用额外的进程和管道结构?;-)
我希望这有帮助.
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; }
这个
if [[ ! $(cat /etc/passwd | grep "sysa") ]]
Then echo " something"
exit 2
fi
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
$(...)
保持价值,而不是退出状态,这就是为什么这种方法是错误的.但是,在这种特定情况下,它确实有效,因为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
.
发现其他答案相当混乱,希望这有助于某人.
简单地:
if ! examplecommand arg1 arg2 ...; then
#code block
fi
Run Code Online (Sandbox Code Playgroud)
没有任何括号。
归档时间: |
|
查看次数: |
457825 次 |
最近记录: |