Bash変数と型

Bash変数と型

IPアドレスを確認するスクリプトを作成しています。私はこうする:

read pool
checkIp()
{
    local  ip=$1
    local  stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?

    fi
    return $stat
}

checkIp $pool
if [ $? -eq 0 ]
    then
        echo "valid"
    else
        echo "invalid"
fi

これで問題は、2番目のオクテットから始まり、入力にワイルドカード「*」が含まれることを確認することです。 (CIDR表記を使用する方が良いと思いましたが、そうではありません。)今は使用できません-le。数字がないと失敗します。

いくつかのフォームを試しましたが、すべての変換に失敗しました。

答え1

もう一度書き直してください。 (Bash関連の正規表現を使用している場合は、BASH_REMATCHトークン化を操作する代わりに配列だけを埋めます。)

checkIp()
{
  local ip="$1"

  if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
    for ((i=1;i<=4;i++)); do
      [[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
    done

    return 0
  fi

  return 1
}

修正する~によるとオーナーレビュー「*」の後の数字は禁止されています。

checkIp()
{
  local ip="$1"
  local asterisk=''

  if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
    for ((i=1;i<=4;i++)); do
      [[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
      [[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
    done

    return 0
  fi

  return 1
}

答え2

参考として、zshを使用すると、次のように書くことができます。

[[ $ip = <0-255>.(<0-255>|"*").(<0-255>|"*").(<0-255>|"*") ]]

許可されていますが、10進数のみが考慮されるため、許可されません000001.0000255.*.00377.1.1.18進数の範囲内であっても)。0377

関連情報