Linux Shell如何判斷IP的合法性?
網(wǎng)友解答: 要解決Linux下判斷IP的合法性問題,老規(guī)矩,先進(jìn)行問題分解。這個(gè)問題可以分解為:判斷給出的IP是否為4段由'.'分隔的數(shù)字組合限制每個(gè)數(shù)字組合的大小在0-255之間多說一
要解決Linux下判斷IP的合法性問題,老規(guī)矩,先進(jìn)行問題分解。這個(gè)問題可以分解為:
判斷給出的IP是否為4段由'.'分隔的數(shù)字組合
限制每個(gè)數(shù)字組合的大小在0-255之間
多說一句:檢測(cè)IP的合法性的算法在網(wǎng)上一搜一大把,一篇文章抄來抄去。但都是甩出一大堆代碼來沒有很具體的解釋,看上去很方便,但是對(duì)參照學(xué)習(xí)的人一點(diǎn)好處都沒有,囫圇吞棗,抄完了還是啥都不會(huì)。
第一步我們先實(shí)現(xiàn)“判斷給出的IP是否為4段由'.'分隔的數(shù)字組合”的目標(biāo)一、Linux bash shell編程的時(shí)候遇到這種需要檢測(cè)格式的問題,首先就要想到正則表達(dá)式。下面我先逐步用組合的方式來構(gòu)造我們需要的正則表達(dá)式:
正則表達(dá)式匹配固定模式的字符串的時(shí)候,我們首先安排一個(gè)標(biāo)記字符串開頭和結(jié)尾的模式;^和$。^代表字符串的開頭位置,$代表字符串的結(jié)尾位置,在它們中間的部分就是用來匹配字符串的內(nèi)容:
IP_PATTERN=“^$”0~255這樣一個(gè)數(shù)字用正則表達(dá)式的語(yǔ)言來說就是:0-9的數(shù)字最少匹配1次,最多匹配3次。分隔的“.”符號(hào)需要使用轉(zhuǎn)義字符,因?yàn)椤?”在正則表達(dá)式中代表除“ n”之外的任何單個(gè)字符,按照IP的格式我們構(gòu)造4段0~255的數(shù)字,加上前面的開始結(jié)束符號(hào),就是這個(gè)樣子:
IP_PATTERN=“^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$”二、根據(jù)正則表達(dá)式判斷IP是否“合規(guī)”可以使用if條件判斷
if [ $IP=~ $IP_PATTERN ]也可以使用grep語(yǔ)句加上-E參數(shù)
echo $IP | grep -E $IP_PATTERN使用grep語(yǔ)句看一下我們構(gòu)造的正則表達(dá)式的效果:
可以看到已經(jīng)達(dá)到我們的要求,下一步要想辦法限制每段數(shù)字的范圍在0~255之間。
第二步,限制數(shù)字的范圍在0~255之間因?yàn)橛辛松弦徊匠醪降倪^濾,能夠通過“考驗(yàn)”的合規(guī)字符串都是
XXX.XXX.XXX.XXX
這種形式。所以這里我們使用awk語(yǔ)句,將'.'看做域分隔符,把這4個(gè)數(shù)字分隔開之后分別提取進(jìn)行輸出。前面的正則表達(dá)式已經(jīng)能夠保證每個(gè)數(shù)字都是非負(fù)的,所以不需要判斷≥0的情況:
echo $FILTERED_IP | awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}'如果每一段的數(shù)字都在0~255之間,就會(huì)打印This IP is valid.。
最終效果拿幾個(gè)字符串來試一下效果:
192.168.1.1
192.168.1.1.1
192.168.1.a
192.168.1.278
可以看到能夠?qū)崿F(xiàn)我們需要的效果。
寫成一行就是:
echo $IP | grep -E "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}'總結(jié)一下:“盡信書不如無書”,各種實(shí)例在網(wǎng)上確實(shí)可以信手拈來,但是“拿來主義”導(dǎo)致的后果就是學(xué)不到東西。所以遇到shell編程的問題,先不要慌,跟著我來,老規(guī)矩,先問題分解。
如果我的回答對(duì)你有點(diǎn)價(jià)值,請(qǐng)莫忘點(diǎn)贊加關(guān)注,謝謝!歡迎在評(píng)論區(qū)發(fā)表各種意見。