2017-09-11 55 views
2

我喜歡這個劇本:爲什麼這個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 

爲什麼,以及如何解決這個bug?

+0

用awk'AWK -F '[=,]' '{打印$ 5}' <<< $ monitor_sock_raw1' –

+0

馬克,如果答案_accepted_它解決了你的問題 – Inian

回答

0

您需要添加通配符或模式不匹配。該模式需要匹配文本的整個開始或結束。

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

對於這樣一個簡單的要求,bash支持使用~操作,您可以使用它後,它的port字符串和匹配數字匹配regex(見bash ERE support)的方法。

#!/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後的第一個元素包含1個ST捕獲組的值英寸

RegEx Demo

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%%,*}