Linux
shell:創建使用 IP 地址作為參數的快捷命令(別名或函式)
我不確定我是否執行了以下非法或真實的操作
但我需要的是 - 創建一組準備好的命令
,所以如果我需要使用,例如將 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
變數中。