在我的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
进行第一部分,第二部分使用grep
和awk
:
#!/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
表达式。这是仅使用grep
或sed
的改进,因为它也将拒绝大于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相当复杂,但可以分解为:
- 弦开始后,必须有三组"八位字",然后是周期,然后再进行另一个"八位钟",字符串的结尾
- 八位位于
- 250-255,
- 200-249
- 100-199(包括000-099,在数字之前具有显式0s)
- 一两个数字(即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