我想直接评论另一个直接询问此人的帖子,但我无法发表评论,似乎我也不能给他发消息,因此我会向好社区寻求帮助。
在有问题的帖子中(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 !!!"
我提前感谢您的帮助!!谢谢!
答案 0 :(得分:1)
第一个命令从变量$SERVER
中提取字符串的前两个字符,如果它与模式匹配(这是\(db\|bk\|ws\)
部分周围的括号)。因此,如果字符串匹配,变量$srv
将包含三个db
,bk
或ws
中的一个,否则它将包含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 group
,expr
的结果将是匹配的capture group
内部,所以db,bk或ws。