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

이제 문제는 두 번째 옥텟부터 시작하여 입력에 와일드카드 "*"가 포함될 수 있는지 확인하는 것입니다. (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.*.0허용되지 않습니다 0377.1.1.1(8진수 범위 내에 있더라도 ).0377

관련 정보