bash中的变量验证(名称和IP地址)



在我的bash脚本的标题中,我必须询问用户名和他的IP地址。

我需要以这种方式验证条目:

  • 用户名必须存储在name变量中,并由下划线代替他的空间。对于用户点击"Albert Smith",我必须将"Albert_Smith"存储到我的变量name中。
  • 对于IP地址,我需要知道IP地址是否与格式一致。如果格式不好,我必须报告错误并提示用户输入一个好的IP地址以继续操作。

我知道我需要使用"阅读",但是我不知道要意识到我的简短脚本(替换和验证)。预先感谢:)

又是另一种方式。仅敲击:

#!/bin/bash
read name
name=${name// /_}
read ip
if [[ "$ip" =~ ^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})$ ]]
then
    for (( i=1; i<${#BASH_REMATCH[@]}; ++i ))
    do
      (( ${BASH_REMATCH[$i]} <= 255 )) || { echo "bad ip" >&2; exit 1; }
    done
else
      echo "bad ip" >&2
      exit 1;
fi
echo "name:$name"
echo "ip:$ip"

不是对问题的答案,而是对于那些爱"一个班轮"的人,IP验证正则是:

[[ "$IP" =~ ^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]] && echo "valid" || echo "invalid"

您可以使用tr进行第一部分,第二部分使用grepawk

#!/bin/sh
echo "Enter a name:"
read FULL_NAME
FULL_NAME_REPLACED="$(echo $FULL_NAME | tr ' ' _)"
echo $FULL_NAME_REPLACED
echo "Enter an IP address:"
read IP_ADDRESS
if echo "$IP_ADDRESS" | egrep -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
then
    # Then the format looks right - check that each octect is less
    # than or equal to 255:
    VALID_IP_ADDRESS="$(echo $IP_ADDRESS | awk -F'.' '$1 <=255 && $2 <= 255 && $3 <= 255 && $4 <= 255')"
    if [ -z "$VALID_IP_ADDRESS" ]
    then
        echo "The IP address wasn't valid; octets must be less than 256"
    else
        echo "The IP address was valid"
    fi
else
    echo "The IP address was malformed"
fi

如果找到此线程中使用的awk表达式。这是仅使用grepsed的改进,因为它也将拒绝大于255的 400.400.400.400

我想您的条目将是基于行的(即。名称将是第一行,而IP是第二行)。您可以这样做:

#!/bin/bash
read name    
while [[ ! "$name" =~ '[A-Za-z ]' ]]; do
    read -p "Wrong name format. Re-enter: " name
done
name="${name// /_}"
read ip
while [[ ! "$ip" =~ '^((25[0-5]|2[0-4][0-9]|[01][0-9][0-9]|[0-9]{1,2})[.]){3}(25[0-5]|2[0-4][0-9]|[01][0-9][0-9]|[0-9]{1,2})$' ]]; do
    read -p "Not an IP. Re-enter: " ip
done

IP REGEX相当复杂,但可以分解为:

  1. 弦开始后,必须有三组"八位字",然后是周期,然后再进行另一个"八位钟",字符串的结尾
  2. 八位位于
    1. 250-255,
    2. 200-249
    3. 100-199(包括000-099,在数字之前具有显式0s)
    4. 一两个数字(即0-99)

循环表单将否定! grep的结果,因此在grep命令失败时它将继续循环。我们使用printf将变量传递到grep中。第二个grep上的-E标志允许使用扩展的正则表达式,其中包括|或操作员,()分组和{}重复。

希望这对有点=)

read name
name=`echo $name|tr ' ' _`
read ip
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

相关内容

  • 没有找到相关文章

最新更新