Bash expr命令逻辑

时间:2015-07-26 15:46:48

标签: regex bash

我想直接评论另一个直接询问此人的帖子,但我无法发表评论,似乎我也不能给他发消息,因此我会向好社区寻求帮助。

在有问题的帖子中(found here)我一直在阅读手册页...但我不明白以下代码是如何工作的。

srv=`expr "$SERVER" : '^\(db\|bk\|ws\)-[0-9]\+\.host\.com$'`
echo -n "$SERVER : "
case $srv in
  ws) echo "Web Server" ;;
  db) echo "DB server" ;;
  bk) echo "Backup server" ;;
  *) echo "Unknown server !!!"
esac

逐行说明,我理解脚本($#)的输入将通过expr命令与后面所述的正则表达式进行比较...并且输出结果为0,1,2,或3.输出将存储到$ svr变量...

除非我误解代码......否则这并不意味着答案永远是:

"Unknown server !!!"

我提前感谢您的帮助!!谢谢!

2 个答案:

答案 0 :(得分:1)

第一个命令从变量$SERVER中提取字符串的前两个字符,如果它与模式匹配(这是\(db\|bk\|ws\)部分周围的括号)。因此,如果字符串匹配,变量$srv将包含三个dbbkws中的一个,否则它将包含0

值得一提的是,没有必要再使用expr,因为这可以使用bash正则表达式来实现:

re='^(db|bk|ws)-[0-9]+\.host\.com$'
[[ $SERVER =~ $re ]] && srv=${BASH_REMATCH[1]}

由于bash支持扩展正则表达式语法,因此无需转义捕获组或|周围的括号。

答案 1 :(得分:1)

  

命令后者表示正则表达式...并且表示输出   将是0,1,2或3。

没有。此部分\(db\|bk\|ws\)表示如果匹配此部分和周围部分,由于括号capture groupexpr的结果将是匹配的capture group内部,所以db,bk或ws。