Bash
Bash:提取 IPv4 地址的四個部分之一
我們可以使用語法
${var##pattern}
和${var%%pattern}
提取 IPv4 地址的最後和第一部分:IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.}
我們如何使用參數擴展提取 IPv4 地址的第二或第三部分?
這是我的解決方案:我使用數組並更改 IFS 變數。
:~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP<<<"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15
此外,我還使用 、 和 命令編寫了一些
awk
解決sed
方案cut
。現在,我的問題是:是否有基於不使用數組和 IFS 更改的參數擴展的更簡單的解決方案?
假設 IFS 的預設值,您將每個八位字節提取到它自己的變數中:
read A B C D <<<"${IP//./ }"
或者進入一個數組:
A=(${IP//./ })
我確實意識到您專門要求了一個沒有暫時重新定義的解決方案
IFS
,但是我有一個您沒有涵蓋的甜蜜而簡單的解決方案,所以這裡是:IFS=. ; set -- $IP
這個簡短的命令會將你的 IP 地址的元素放在 shell 的位置參數
$1
,$2
,$3
, 中$4
。但是,您可能希望先保存原始IFS
文件,然後再恢復。誰知道?也許您會因其簡潔和高效而重新考慮並接受此答案。
(這以前被錯誤地給出為
IFS=. set -- $IP
)