回覆列表
  • 1 # 產品經理老胡

    要解決Linux下判斷IP的合法性問題,老規矩,先進行問題分解。這個問題可以分解為:

    判斷給出的IP是否為4段由"."分隔的數字組合

    限制每個數字組合的大小在0-255之間

    多說一句:檢測IP的合法性的演算法在網上一搜一大把,一篇文章抄來抄去。但都是甩出一大堆程式碼來沒有很具體的解釋,看上去很方便,但是對參照學習的人一點好處都沒有,囫圇吞棗,抄完了還是啥都不會。

    第一步我們先實現“判斷給出的IP是否為4段由"."分隔的數字組合”的目標

    一、Linux bash shell程式設計的時候遇到這種需要檢測格式的問題,首先就要想到正則表示式。下面我先逐步用組合的方式來構造我們需要的正則表示式:

    正則表示式匹配固定模式的字串的時候,我們首先安排一個標記字串開頭和結尾的模式;^和$。^代表字串的開頭位置,$代表字串的結尾位置,在它們中間的部分就是用來匹配字串的內容:

    IP_PATTERN=“^$”

    0~255這樣一個數字用正則表示式的語言來說就是:0-9的數字最少匹配1次,最多匹配3次。分隔的“.”符號需要使用跳脫字元,因為“.”在正則表示式中代表除“ \n”之外的任何單個字元,按照IP的格式我們構造4段0~255的數字,加上前面的開始結束符號,就是這個樣子:

    IP_PATTERN=“^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$”

    二、根據正則表示式判斷IP是否“合規”可以使用if條件判斷

    if [ $IP=~ $IP_PATTERN ]

    也可以使用grep語句加上-E引數

    echo $IP | grep -E $IP_PATTERN

    使用grep語句看一下我們構造的正則表示式的效果:

    可以看到已經達到我們的要求,下一步要想辦法限制每段數字的範圍在0~255之間。

    第二步,限制數字的範圍在0~255之間

    因為有了上一步初步的過濾,能夠透過“考驗”的合規字串都是

    XXX.XXX.XXX.XXX

    這種形式。所以這裡我們使用awk語句,將"."看做域分隔符,把這4個數字分隔開之後分別提取進行輸出。前面的正則表示式已經能夠保證每個數字都是非負的,所以不需要判斷≥0的情況:

    echo $FILTERED_IP | awk -F. "$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}"

    如果每一段的數字都在0~255之間,就會列印This IP is valid.。

    最終效果

    拿幾個字串來試一下效果:

    192.168.1.1

    192.168.1.1.1

    192.168.1.a

    192.168.1.278

    可以看到能夠實現我們需要的效果。

    寫成一行就是:

    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."}"

    總結一下:“盡信書不如無書”,各種例項在網上確實可以信手拈來,但是“拿來主義”導致的後果就是學不到東西。所以遇到shell程式設計的問題,先不要慌,跟著我來,老規矩,先問題分解。

  • 中秋節和大豐收的關聯?
  • 你們是怎麼看待華為手機的?華為手機未來的前景會如何?