我必须编写一个shell脚本,我需要在许多远程服务器上运行。 该脚本基本上在这些服务器上执行traceroute -m。
我必须首先验证ip格式,然后从输入中提取IP地址。
输入: -
192.168.1.1
192.168.1.1 2222
192.168.1.1:2222
Any garbage values
输入中没有端口,端口号或冒号前面没有空格。
我必须提取输入的ip部分(192.168.1.1
)
我的剧本: -
ip=`echo $1`
re='^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[ :]([0-9]{1,5})$'
if [[ $ip =~ $re ]]; then
ip=`echo $ip | sed 's/[ :].*//'`
command=$(traceroute -m 9 $ip 2>&1)
echo "$command"
else
echo "Entered ip address is not valid"
fi
我如何将ip传递给脚本: -
$./script.sh 192.168.1.1 2222
这个脚本验证了ip,但是如果我通过ip传递空格和端口号,则不会。
输入:-192.168.1.1 2222(不工作)
输入: - 192.168.1.1:2222(工作)
输入: - 192.168.1.1(不工作) 任何人都可以指出错误吗?
EDITED
好吧,我要用这个剧本: -
1 #!/bin/bash
2 ip="$@"
3 re='([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})'
4 if [[ "$ip" =~ $re ]]; then
5 ip=`echo "$ip" | sed 's/^\([^: ]*\).*$/\1/'`
6 command=$(traceroute -m 9 "$ip" 2>&1)
7 echo "$command"
8 else
9 echo "Entered ip address is not valid"
10 fi
值得注意的是什么?我可能错过的任何情景?
答案 0 :(得分:3)
您的正则表达式需要删除^
和$
。
让你的脚本像这样:
re='([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})[ :]'
if [[ "$ip" =~ $re ]]; then
ip="${BASH_REMATCH[1]}"
command=$(traceroute -m 9 "$ip" 2>&1)
echo "$command"
else
echo "Entered ip address is not valid"
fi
答案 1 :(得分:3)
这个脚本验证了ip,但是如果我用ip传递ip,则不会。
因为脚本的参数 - $1
,$2
,$3
等 - 在空格上分开。如果要将整个数组视为一个字符串,请使用$@
。
BTW:
ip=`echo $1`
是多余的; ip=$1
就足够了(或ip=$@
)。
然而,现有的正则表达式现在将无法使用没有端口的ip。要纠正这个问题,只需删除最后一部分:
re='^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})'
如果您需要执行更全面的验证,请在结尾处使用[: ]*[0-9]*$
。