3

我正在尝试结合这两个参数来使我的函数工作

#!/bin/bash

while [ $? -gt 0 ] 
do
  case "$1" in             
    [0-9]*-[0-9]*)
      for ip in $(sec ${1%-*} ${##*-})
      do
        ping -c 1 192.168.1.$ip
        (shift)?
      done
      ;;
    a)
      >/dev/null;
      [ $? -eq 0 ] && echo "192.168.1.$ip is up!" ||:;
      ;;
  esac
done

通常,如果我将这两个函数都放在[0-9]*-[0-9]*)参数中,我们可以得到例如输出

someTest.sh 90-105 

它会检查 90 到 105 之间的 IP 号码但我想这样做:

sometest.sh 90-105 -a
4

2 回答 2

1

我看到您想检查机器是在您从命令行指定的范围内上升还是下降。您可以简单地使用 for 循环来完成。

#!/bin/bash

a=$1;
b=$2;

for ((i=a;i<=b;i++)) do

   ping -c 1 -w 1 192.168.1.$i  >> /dev/null 2>&1

   if [ $? -eq 0 ]; then
      echo "192.168.1.$i is up";
   else
      echo "192.168.1.$i is down";
   fi

done

从命令行运行它:./script 10 50从 192.168.1.10 ping 机器到 192.168.1.50。


如果你想传递这样的参数:./script 10-50那么你也可以这样做:

#!/bin/bash

OLDIFS=$IFS
IFS=$'\-'
set $@

a=$1;
shift;
b=$1;

for ((i=a;i<=b;i++)) do

   ping -c 1 -w 1 192.168.1.$i  >> /dev/null 2>&1
   if [ $? -eq 0 ]; then
     echo "192.168.1.$i is up";
   else
     echo "192.168.1.$i is down";
   fi

done

IFS=$OLDIFS

于 2012-08-23T12:36:43.810 回答
0

如果您想做的是在某个范围内 ping IP,并且还能够传递其他参数(-a 和/或 -b),您可以查看 getopts 以轻松处理所需数量的参数,使用或没有选项:

usage()
{
cat << EOF
usage: $0 options iprange

OPTIONS:
   -a      set a option
   -b      set b option
   -r      set rangei, e.g 1 10
EOF
}

A=
B=

while getopts “abr:” OPTION
do
     case $OPTION in
         a)
             A=1
             ;;
         b)
             B=1
             ;;
         r)  
             RANGE="$OPTARG"
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

for i in $(seq $RANGE); do
    ping -c 1 -w 1 192.168.1.$i  >> /dev/null 2>&1

    if [ $? -eq 0 ]; then
        echo "192.168.1.$i is up";
    else
        echo "192.168.1.$i is down";
fi
done

你会这样称呼它:

./somescript.sh -a -b -r "10 34"

您可以检查 $A 和 $B 变量并根据它们的值做任何您想做的事情。

我知道,范围分隔符之间没有破折号,你需要引号,写得很快,你可以使用上面 KingsIndian 的解决方案来处理这个问题。

于 2012-08-23T14:21:39.757 回答