如果我可能没有接收到全部4个八位字节作为输入,那么如何使用Bash将IP地址分成4个八位字节变量?

如果我可能没有接收到全部4个八位字节作为输入,那么如何使用Bash将IP地址分成4个八位字节变量?,bash,ip,Bash,Ip,我正在编写一个将在bash中运行的脚本 此程序的预期输入将类似于以下4种情况之一: 运行192.168.1.1[其他参数] 运行168.1.1[其他参数] 运行1.1[其他参数] 运行1[其他参数] 考虑到这些情况,我想要以下数组 IP[0]=192 IP[1]=168 IP[2]=1 IP[3]=1 始终需要第四个八位组。如果未提供其他选项,则默认为192.168.1.x 我在单独的八位字节上看到了这一页,但我不确定如何解释我需要处理的4种不同的输入情况 任何关于我如何改进或实施的帮助或建议都

我正在编写一个将在bash中运行的脚本

此程序的预期输入将类似于以下4种情况之一:

运行192.168.1.1[其他参数]

运行168.1.1[其他参数]

运行1.1[其他参数]

运行1[其他参数]

考虑到这些情况,我想要以下数组

IP[0]=192

IP[1]=168

IP[2]=1

IP[3]=1

始终需要第四个八位组。如果未提供其他选项,则默认为192.168.1.x

我在单独的八位字节上看到了这一页,但我不确定如何解释我需要处理的4种不同的输入情况

任何关于我如何改进或实施的帮助或建议都将不胜感激


谢谢。

这应该行得通。它使用蛮力查找IP的长度,并使用$IFS变量将其分隔到数组中:

#! /bin/bash
function full_ip () {
    if [[ $1 = *.*.*.* ]] ; then
        echo $1
    elif [[ $1 = *.*.* ]] ; then
        echo 192.$1
    elif [[ $1 = *.* ]] ; then
        echo 192.168.$1
    else
        echo 192.168.1.$1
    fi

}

for ip in 192.168.1.1 168.1.1 1.1 1 ; do
    f=$(full_ip $ip)
    echo -n $f$'\t'
    IFS=. IP=($f) IFS=$' \t\n'
    echo ${IP[0]} ${IP[1]} ${IP[2]} ${IP[3]}
done

这应该行得通。它使用蛮力查找IP的长度,并使用$IFS变量将其分隔到数组中:

#! /bin/bash
function full_ip () {
    if [[ $1 = *.*.*.* ]] ; then
        echo $1
    elif [[ $1 = *.*.* ]] ; then
        echo 192.$1
    elif [[ $1 = *.* ]] ; then
        echo 192.168.$1
    else
        echo 192.168.1.$1
    fi

}

for ip in 192.168.1.1 168.1.1 1.1 1 ; do
    f=$(full_ip $ip)
    echo -n $f$'\t'
    IFS=. IP=($f) IFS=$' \t\n'
    echo ${IP[0]} ${IP[1]} ${IP[2]} ${IP[3]}
done

首先,将IP地址分成4个部分,但仅在“填充”它以保证4个字段后:

input=168.1.1
IFS=. read -a o <<< "...$input"
最后,您可以将其重新缝合在一起:

output=$( IFS=.; echo "${ip[*]}" )

首先,将IP地址分成4个部分,但仅在“填充”它以保证4个字段后:

input=168.1.1
IFS=. read -a o <<< "...$input"
最后,您可以将其重新缝合在一起:

output=$( IFS=.; echo "${ip[*]}" )

谢谢,这正是我想要的,并没有强迫我求助于一些野蛮的强制循环。我还能够用ip替换o,只是为了避免创建额外的变量。谢谢,这正是我想要的,并没有强迫我求助于一些野蛮的强制循环。我还能够用ip替换o,只是为了避免创建额外的变量。