0

私はbashで実行されるスクリプトを書いています。

このプログラムの予想される入力は、次の4つのケースのいずれかになります。

192.168.1.1を実行[その他のパラメータ]

実行168.1.1[その他のパラメータ]

1.1を実行[その他のパラメータ]

run1[その他のパラメータ]

これらのケースのいずれかを考えると、次の配列が必要です。

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"

次に、デフォルト値のパラメーター展開を使用してパッチを適用した出力を作成し、パディングからnull文字列が割り当てられたフィールドにパッチを適用します。

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変数を使用してIPを配列に分離します。

#! /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 に答える