从shell脚本中的命令行参数中提取模式

时间:2014-07-09 10:06:43

标签: regex shell

我必须编写一个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

值得注意的是什么?我可能错过的任何情景?

2 个答案:

答案 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]*$