我有以下命令,例如:
command1 | grep "xxxx"
command1
将输出一些行文本。
我希望当行包含exit 1
时执行xxxx
,或将行输出到控制台,例如:
command1 | if [ grep "xxxx" ] then; exit 1; else echo;
我应该如何编写外壳? 谢谢!
答案 0 :(得分:0)
由于您要测试grep
的退出状态,并且要查看该行是否不包含xxxx
,因此可以修改以下代码以适应我们的要求( m使用echo "$line"
作为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
的情况下看到输出,而是这样做,因此-v
的{{1}}选项会反转逻辑,只打印与{ {1}}。当grep
的状态仅是找到与xxxx
不匹配的行时,其状态为0;而如果grep -v 'xxxx'
所找到的行与之匹配,则状态为0。 xxxx
运算符反转此状态,1
测试反转状态是否为0,如果反转状态为0,则执行!
代码。
请注意,if
只是返回then
测试的合适退出状态的命令。在许多系统上,您可以找到[
作为可执行文件,也许是指向if
的(符号?)链接-但是现代的shell总是将/bin/[
和/bin/test
视为内置文件,在命令中。请注意,[
检查其最后一个参数是否为test
,如果不是,则检查对象。 [
不会。