【发布时间】:2019-04-28 17:19:21
【问题描述】:
我有以下命令,比如:
command1 | grep "xxxx"
command1 将输出一些行文本。
我希望在包含xxxx的行时执行exit 1,或者将该行输出到控制台,例如:
command1 | if [ grep "xxxx" ] then; exit 1; else echo;
我应该如何编写shell? 谢谢!
【问题讨论】:
我有以下命令,比如:
command1 | grep "xxxx"
command1 将输出一些行文本。
我希望在包含xxxx的行时执行exit 1,或者将该行输出到控制台,例如:
command1 | if [ grep "xxxx" ] then; exit 1; else echo;
我应该如何编写shell? 谢谢!
【问题讨论】:
由于您要测试grep 的退出状态,并且您想查看不包含xxxx 的行,您可以修改以下代码以满足我们的要求(我使用的是@987654324 @ 作为您的command1 的代理,我在呼应exit 1,而不是在您的代码执行exit 1 时实际退出):
for line in 'hello xxxx here' 'hello yyyy here'
do
if ! echo "$line" | grep -v 'xxxx'
then echo "exit 1"
fi
done
输出是:
exit 1
hello yyyy here
请参阅How can I negate the return value of a process?,了解有关 POSIX shell(例如 Bash)中 ! 运算符的讨论。
由于您不想看到包含xxxx 的输出,但不希望看到它,所以grep 的-v 选项会反转逻辑,只打印与xxxx 不匹配的行。 grep -v 'xxxx' 的状态是 0 当它只找到不匹配 xxxx 的行时,1 如果它找到匹配的行。 !操作符反转这个状态,if测试反转状态是否为0,如果反转状态为0则执行then代码。
请注意,[ 只是一个返回适当退出状态的命令,if 测试该退出状态。在许多系统上,您可以将/bin/[ 视为一个可执行文件,也许是指向/bin/test 的(符号?)链接——但现代shell 总是将[ 和test 视为内置命令。请注意,[ 检查其最后一个参数是否为],如果不是则为对象; test 没有。
【讨论】: