我有一個字串
VAR_A="127.0.0.1:12345"
我想用分隔符將它分成HOSTNAMEand 。PORT:
根據這篇文章,我使用這種語法來拆分原始VAR_A字串:
HOSTNAME=${VAR_A%%:*}
PORT=${VAR_A#*:}
如果是VAR_Aif 形式,它就可以作業xxxx:xxxx。
但我想根據傳遞給的值得到以下結果VAR_A:
- 如果
VAR_A不包含 char:,例如VAR_A=127.0.0.1,則HOSTNAME賦值為127.0.0.1,并將空字串賦值給PORT - 如果
VAR_A包含 char:但之后沒有任何內容:,例如VAR_A=127.0.0.1:,則相同,HOSTNAME分配為127.0.0.1,并將空字串分配給PORT - 如果
VAR_A包含字符:但在此之前,沒有什么:,例如VAR_A=:12345,然后分配空字串HOSTNAME,并12345到PORT。
使用當前代碼 if VAR_A=127.0.0.1,我得到了HOSTNAME=127.0.0.1和PORT=127.0.0.1,這是不希望的。
如果可行,我更喜歡與我提供的語法類似的語法——越簡潔/優雅越好。
uj5u.com熱心網友回復:
怎么regex解決:
list=(127.0.0.1:12345 127.0.0.1 127.0.0.1: :12345)
for VAR_A in "${list[@]}"; do
if [[ $VAR_A =~ ^([0-9.]*):?([0-9]*)$ ]]; then
HOSTNAME=${BASH_REMATCH[1]}; PORT=${BASH_REMATCH[2]}
printf "%-16s HOSTNAME=%-10s PORT=%-10s\n" "$VAR_A" "$HOSTNAME" "$PORT"
fi
done
輸出:
127.0.0.1:12345 HOSTNAME=127.0.0.1 PORT=12345
127.0.0.1 HOSTNAME=127.0.0.1 PORT=
127.0.0.1: HOSTNAME=127.0.0.1 PORT=
:12345 HOSTNAME= PORT=12345
正則運算式的解釋^([0-9.]*):?([0-9]*)$:
^([0-9.]*)匹配$VAR_A.開頭的零個或多個長度的數字和/或點序列。匹配的子字串用 捕獲${BASH_REMATCH[1]}。正則運算式不會嚴格驗證 ipv4 地址,但足以達到目的。:?匹配零個或一個冒號字符。([0-9]*)$匹配$VAR_A.末尾的零個或多個長度的數字序列。匹配的子字串用 捕獲${BASH_REMATCH[2]}。
uj5u.com熱心網友回復:
您可以使用另一個引數擴展來洗掉第一部分:
VAR_A=127.0.0.1
HOSTNAME=${VAR_A%%:*}
PORT=${VAR_A#"$HOSTNAME"}
PORT=${PORT#:}
如果 VAR_A 中沒有換行符:
IFS=: read -r HOSTNAME PORT <<< "$VAR_A"
uj5u.com熱心網友回復:
如果這是針對 bash 腳本的,您可以if..else像使用任何其他編程語言一樣使用陳述句。
我建議您查看本教程頁面并創建某種型別的腳本,首先檢查您的字串是否具有該:字符,然后根據需要執行進一步的操作(例如,根據主機和埠的需要決議左/右半部分)。
當然,這只是一種方法;還有很多其他方法可以做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406195.html
標籤:
上一篇:$@陣列與常規陣列有何不同
下一篇:使用bash過濾行
