我想监视命令的输出,并且每当它包含某个字符串时,我想运行另一个命令。
例如:当命令1输出1234时我想运行命令2
答案1
通常这是通过if
语句和grep
管道来实现的。例如
$ if df | grep '/dev/sdb1' -q; then echo "Partition mounted"; fi
Partition mounted
这里的技巧是,if
语句对命令的退出状态进行操作,整个管道的退出状态是最后一个命令的退出状态。当然grep -q
不会在屏幕上打印任何内容,但零退出状态会告诉您命令是否成功(即grep
在输出中找到所需的字符串)或非零退出状态。
一种不同的方法是通过case
语句和命令替换,我发现这种方法可能更适合于输出只有单行的情况,以及你想要在操作系统之间实现脚本的可移植性(又名 POSIX 兼容性)。
case "$(mountpoint /)" in
*"is a mountpoint"*) echo "Yup,it's a mount point alright";
stat /;;
esac
第三种方法,是再次通过命令替换和test
命令进行精确匹配。
[ "$(command1 )" = "Some string" ]
或者对模式匹配进行bash
扩展测试:[[
# [[ $(command1) =~ ^pattern$ ]]
$ [[ "$( mountpoint /proc )" =~ .*is\ a\ mountpoint.* ]] && echo "Yup"
Yup
这些可以在if
语句中使用,或者与条件运算符一起使用&&
,例如[ "$(echo test)" = "test" ] && df
。
我认为最好的方法是将其全部变成一个函数,以便您可以将参数传递给所需的命令,并可能稍后在if
或case
语句中重复使用它。因此,如下所示:
check_mountpoint(){
case "$(mountpoint "$1")" in
*"is a mountpoint"*) echo "Yup,"$1" is a mount point alright";
stat "$1";;
esac
}
当然,请记住,这些只是略显冗长,也许没有必要,但仍然是如何做到这一点的示例。根据需要调整您的具体情况。请记住,这也不是详尽的信息。
答案2
我会用这个:
[[ $(Command1) == 1234 ]] && Command2
- and
[[
测试]]
里面的条件是否为真 &&
Command2
如果条件测试为真,则执行$(...)
执行括号内的命令并返回输出(在里面回显的内容Command1