在bash中使用shift with case语句

时间:2012-08-23 12:20:14

标签: bash

我正在尝试将这两个参数结合起来使我的功能正常工作

#!/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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的解决方案来解决这个问题。