当命令输出具有特定字符串时执行脚本

当命令输出具有特定字符串时执行脚本

我想监视命令的输出,并且每当它包含某个字符串时,我想运行另一个命令。

例如:当命令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

我认为最好的方法是将其全部变成一个函数,以便您可以将参数传递给所需的命令,并可能稍后在ifcase语句中重复使用它。因此,如下所示:

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

相关内容