shell:创建使用 IP 地址作为参数的快捷命令(别名或函数)

shell:创建使用 IP 地址作为参数的快捷命令(别名或函数)

我不确定我执行了以下操作是否违法或真实

但我需要的是 - 创建一组现成的命令,
以便如果我需要使用,例如将 IP 地址与 4 个八位字节匹配,我可以使用命令 - 命令_匹配_四个八位字节

请告知我是否正确执行了以下操作,并且我想知道以下语法是否不会引起麻烦。

[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

答案1

你所说的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变量中。

答案2

如果你想要创建另一个命令的快捷方式,你可以使用内置的 shell 命令alias。有关更多信息,你可以参阅man bash

例如,您可以使用:

$ alias your_command_name='your complicated and long command'

相关内容