0

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

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

运行 192.168.1.1 [其他参数]

运行 168.1.1 [其他参数]

运行 1.1 [其他参数]

运行 1 [其他参数]

鉴于这些情况中的任何一种,我都希望拥有以下数组。

IP[0]=192

IP[1]=168

IP[2]=1

IP[3]=1

始终需要第 4 个八位字节。如果其他没有提供,它们将默认为 192.168.1.x。

我看到了关于分离八位字节的这个页面,但我不确定如何解释我需要处理的 4 种不同的输入情况。这里。

任何有关如何改进或实施此功能的帮助或建议将不胜感激。

谢谢。

4

2 回答 2

5

首先,将 IP 地址拆分为 4 个部分,但只有在“填充”后才能保证 4 个字段:

input=168.1.1
IFS=. read -a o <<< "...$input"

然后,构建修补后的输出,使用默认值参数扩展来修补从填充中分配了空字符串的字段。

declare -a ip=( ${o[-4]:-192}
                ${o[-3]:-168}
                ${o[-2]:-1}
                ${o[-1]:-1} )

最后,您可以将其缝合在一起:

output=$( IFS=.; echo "${ip[*]}" )
于 2012-08-29T04:32:22.743 回答
1

这应该有效。它使用蛮力来查找 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
于 2012-08-29T02:07:53.010 回答