我的脚本是这样的:
#!/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
为什么以及如何修复此错误?
答案 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 被捕集团。
答案 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%%,*}