Bash字符串匹配

时间:2011-08-07 18:34:56

标签: bash

我需要一个单行bash命令,它接受管道输入并返回true或false,具体取决于它是否与字符串匹配..

这似乎适用于真假部分:

test `expr match "Release:11.04" "Release:11.04"` = 13 && echo true || echo false

但我不能让它与其他命令的输出正常工作..

我需要的是这样的:

test `expr match "`lsb_release -r`" "Release:11.04"` = 13 && echo true || echo false

所以我尝试使用xargs,但我无法让它工作:

lsb_release -r | xargs -I {} test `expr {} "Release: 11.04"` = 13 && echo True || echo False

另外,如果你们中的任何一个碰巧知道更短的方法来实现这一点,那将非常受欢迎。

3 个答案:

答案 0 :(得分:3)

您可以使用$(cmd)语法。

test $(expr match "$(lsb_release -r)" "Release:11.04") = 13 && echo true || echo false

虽然在我的系统上,在':'之后的lsb_release输出中有一个标签,所以你可能想要仔细检查你的支票。

实际上在摆弄了一下之后,我认为这将是一个更好的方式与bash(在Debian系统上测试):

[[ "$(lsb_release -r)" =~ $'Release:\t6.0.2' ]] && echo true || echo false

答案 1 :(得分:1)

为什么不这样:

[ `lsb_release -r | awk '{print $2}'` = "11.04" ] && echo true || echo false

顺便说一句,如果你需要使用嵌套的``,你可以使用\来逃避内部的那个:

test `expr match "\`lsb_release -r\`" "Release:11.04"`

但它看起来很难看。使用$()更具可读性,但不那么便携。

答案 2 :(得分:0)

这将是另一种更简单的方法 -

lsb_release -r | grep -q "11.04" && echo true || echo false

基本上,这会使lsb_release -r的输出为11.04。如果找到匹配项,grep中的-q将返回退出状态零,这将回显true。否则false