我想在cat /etc/passwd | grep“sysa”不为真时执行echo命令。
我做错了什么?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
我想在cat /etc/passwd | grep“sysa”不为真时执行echo命令。
我做错了什么?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
当前回答
我希望在答案中看到直接使用grep和-q选项(因为我们不关心结果,但只需要返回代码)。
if ! grep -qs "sysa" /etc/passwd; then
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
fi
或(在失败时使用链式执行)
grep -qs "sysa" /etc/passwd || {
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
}
更好的是,因为需要相反的东西,所以有选项-v
if grep -qsv "sysa" /etc/passwd; then
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
fi
或者(在成功时使用链式执行)
grep -qsv "sysa" /etc/passwd && {
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
}
笔记
我喜欢将错误消息重定向到stderr,但回显输出到stdout,因此>&2 泰勒搜索模式,例如'^sysa:'如果它是完全登录。
其他回答
我认为可以简化为:
grep sysa /etc/passwd || {
echo "ERROR - The user sysa could not be looked up"
exit 2
}
或者在单个命令行中
$ grep sysa /etc/passwd || {echo "ERROR - The user sysa could not be lookup ";出口2;}
try
if ! grep -q sysa /etc/passwd ; then
如果Grep找到了搜索目标,则返回true,如果没有找到,则返回false。
所以不是假的(!False) == true。
如果shell中的求值被设计得非常灵活,并且很多时候不需要命令链(正如您所写的那样)。
此外,查看您的代码,您使用$(…)cmd替代的形式是值得赞扬的,但是考虑一下这个过程会带来什么。试试echo $(cat /etc/passwd | grep "sysa")看看我的意思。您可以进一步使用-c (count)选项grep,然后执行if ![$(grep -c "sysa" /etc/passwd) -eq 0];那么这是一个相当老派的方法。
但是,您可以使用最新的shell特性(算术计算),例如
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
这也使您可以使用基于c-lang的比较操作符,==,<,>,>=,<=,%以及其他一些操作符。
在这种情况下,根据orwelloile的评论,算术计算可以进一步削减,比如
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
OR
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
最后,还有一个叫做无用猫奖(uoc)的奖项。:-)有些人会上蹿下跳地喊gothca!我只想说,grep可以在它的cmd行上使用文件名,那么为什么要调用不必要的额外进程和管道结构呢?: -)
我希望这能有所帮助。
这一个
if [[ ! $(cat /etc/passwd | grep "sysa") ]]; then
echo " something"
exit 2
fi
下面是一个例子:
为了确保数据记录器在线,cron脚本每15分钟运行一次,如下所示:
#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
echo "SUBJECT: SOLAR is not responding to ping" | ssmtp abc@def.com
echo "SOLAR is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
echo "SUBJECT: OUTSIDE is not responding to ping" | ssmtp abc@def.com
echo "OUTSIDE is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "OUTSIDE is up"
fi
#
...你可以在蒙太奇中看到的每一个数据记录器 在http://www.SDsolarBlog.com/montage
供参考,使用&>/dev/null将命令的所有输出(包括错误)重定向到/dev/null
(条件只要求ping命令的退出状态)
另外,请注意,由于cron作业以root身份运行,因此不需要在cron脚本中使用sudo ping。
我希望在答案中看到直接使用grep和-q选项(因为我们不关心结果,但只需要返回代码)。
if ! grep -qs "sysa" /etc/passwd; then
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
fi
或(在失败时使用链式执行)
grep -qs "sysa" /etc/passwd || {
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
}
更好的是,因为需要相反的东西,所以有选项-v
if grep -qsv "sysa" /etc/passwd; then
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
fi
或者(在成功时使用链式执行)
grep -qsv "sysa" /etc/passwd && {
echo "ERROR - The user sysa could not be looked up" >&2
exit 2
}
笔记
我喜欢将错误消息重定向到stderr,但回显输出到stdout,因此>&2 泰勒搜索模式,例如'^sysa:'如果它是完全登录。