为什么这个shell脚本无法工作?

时间:2017-09-11 06:28:48

标签: regex bash shell

我的脚本是这样的:

#!/bin/env bash

monitor_sock_raw1=socket,id=hmqmondev,port=55919,host=127.0.0.1,nodelay,server,nowait

msock=${monitor_sock_raw1##,port=}
msock=${msock%%,host=}

echo $msock

我希望得到' 55919',但结果是:

socket,id=hmqmondev,port=55919,host=127.0.0.1,nodelay,server,nowait

为什么以及如何修复此错误?

3 个答案:

答案 0 :(得分:3)

对于这样的简单要求,bash使用regex运算符支持~(请参阅bash ERE support)方法,您可以使用它来匹配{{1}字符串和匹配后面的数字。

port

正则表达式中捕获的组存储在数组#!/bin/env bash var='monitor_sock_raw1=socket,id=hmqmondev,port=55919,host=127.0.0.1,nodelay' if [[ $var =~ ^.*port=([[:digit:]]+).*$ ]]; then printf "%s\n" "${BASH_REMATCH[1]}" fi 中,索引BASH_REMATCH之后的第一个元素,即索引0包含值1 st 被捕集团。

RegEx Demo

答案 1 :(得分:0)

您需要添加通配符或模式不匹配。模式需要匹配文本的整个开头或结尾。

msock=${monitor_sock_raw1##*,port=}
msock=${msock%%,host=*}

答案 2 :(得分:0)

解决问题的脚本。

#!/bin/bash

monitor_sock_raw1="socket,id=hmqmondev,port=55919,host=127.0.0.1,nodelay,server,nowait"

msock=(${monitor_sock_raw1##*port=})

echo ${msock%%,*}