Linux

shell:創建使用 IP 地址作為參數的快捷命令(別名或函式)

  • January 2, 2013

我不確定我是否執行了以下非法或真實的操作

但我需要的是 - 創建一組準備好的命令

,所以如果我需要使用,例如將 IP 地址與 4 個八位字節匹配,我可以使用命令 - command_that_match_four_octet

請告知我是否正確執行了以下操作,我想知道以下語法是否不會造成麻煩。

[root@su1a /tmp]#  command_that_match_four_octet=" grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' "

[root@su1a /tmp]# command_that_match_three_three_octet=" grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' "

.

[root@su1a /tmp]# echo 23.4.5.1  | eval $command_that_match_four_octet
  23.4.5.1

[root@su1a /tmp]# echo 23.4.5 | eval $command_that_match_three_three_octet
  23.4.5

你所說shortcut的似乎是一種alias或更複雜的functions

為了回答你的問題,你可以:

alias checkCommand="grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'"
echo 23.4.5.1  | checkCommand
23.4.5.1

或者

function checkIsIp() {
   grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
}
echo 23.4.5.1  | checkIsIp

有一個 bash 函式將檢查 IP (v4),如果參數是有效 IP,它將計算 32 位整數,RC > 0否則返回一個:

function check_Is_Ip() {
   local IFS=.
   set -- $1
   [ $# -eq 4 ] || return 2
   local var
   for var in $* ;do
       [ $var -lt 0 ] || [ $var -gt 255 ] && return 3
     done
   echo $(( ($1<<24) + ($2<<16) + ($3<<8) + $4))
}

比現在:

if check_Is_Ip 1.0.0.1 >/dev/null; then echo It is. ;else echo There is not. ;fi
It is.

if check_Is_Ip 1.255.0.1 >/dev/null; then echo It is. ;else echo There is not. ;fi
It is.

if check_Is_Ip 1.256.0.1 >/dev/null; then echo It is. ;else echo There is not. ;fi
There is not.

並可用於 IP 計算:

有後退功能:

int2ip() {
   echo $(($1>>24)).$(($1>>16&255)).$(($1>>8&255)).$(($1&255))
}

check_Is_Ip 255.255.255.0
4294967040
check_Is_Ip 192.168.1.31
3232235807

int2ip $((4294967040 & 3232235807))
192.168.1.0

因此,作為一個好的做法,您可以:

function die() {
   echo "Error: $@" >&2
   exit 1
}

netIp="192.168.1.31"
netMask="255.255.255.0"

intIp=$(check_Is_Ip $netIp) || die "Submited IP: '$netIP' is not an IPv4 address."
intMask=$(check_Is_Ip $netMask) || die "Submited Mask: '$netMask' not IPv4."
netBase=$(int2ip $(( intIp & intMask )) )
netBcst=$(int2ip $(( intIp | intMask ^ ( (1<<32) - 1 ) )) )
printf "%-20s: %s\n" \
   Address $netIp Netmask $netMask Network $netBase Broadcast $netBcst

Address             : 192.168.1.31
Netmask             : 255.255.255.0
Network             : 192.168.1.0
Broadcast           : 192.168.1.255

對輸入進行檢查、驗證和轉換只是一項操作:

intMask=$(check_Is_Ip $netMask) || die "Submited Mask: '$netMask' not IPv4."

如果$netMask不匹配 IPv4,該命令check_Is_Ip將失敗,然後die將被執行。否則,轉換結果將儲存在intMask變數中。

引用自:https://serverfault.com/questions/461760