2013-05-21 162 views
11

我正在努力学习案例,因为我正在编写一个功能齐全的脚本。Bash案例陈述

我开始了与下面

#!/bin/sh 
case [email protected] in 

    -h|--help) 
      echo "You have selected Help" 
      ;; 
    -B|-b) 
      echo "You have selected B" 
      ;; 
    -C|-c) 
      echo "You have selected C" 
      ;; 
     *) 
      echo "Valid Choices are A,B,C" 
      exit 1 
      ;; 
esac 

我想用两个选项:

./getopts.sh -h -c 

,但我得到这个结果 有效的选择是A,B,C

请你帮忙,让我知道我做错了什么?

我想要建立一个脚本,如果你输入一个选项,它会做某些事情,但如果你输入多个选项,你可以做很多事情。

另外,我将如何解析$ 1到这个脚本作为surley哪个选项我第一次输入(-h)将是$ 1?

谢谢!

+0

你为什么不使用'getopts',而不是'case'? – fedorqui

+0

我对任何想法都很开放,因为我还没有真正使用过。我需要学习这个,而不是拥有1000个嵌套的if语句 – bsmoo

+0

@fedorqui即使使用getopts,仍然需要一个循环(通常是一个'while循环)和某种案例分析,'case'比if更好...... elif ......就是为了这个目的。 – Uwe

回答

11

试试这个

#!/bin/sh 

usage() { 
    echo `basename $0`: ERROR: $* 1>&2 
    echo usage: `basename $0` '[-a] [-b] [-c] 
     [file ...]' 1>&2 
    exit 1 
} 


while : 
do 
    case "$1" in 
    -a|-A) echo you picked A;; 
    -b|-B) echo you picked B;; 
    -c|-C) echo you picked C;; 
    -*) usage "bad argument $1";; 
    *) break;; 
    esac 
    shift 
done 
+0

好吧,看起来不错。如果我想要一个更加棘手的问题 - 做'whois $ 1'我将如何完成这项工作我希望使用类似'./script.sh -a example.com'或'./script.sh -a - b example.com对此有何看法? – bsmoo

+0

请查看http://www.grymoire.com/Unix/Sh.html#uh-96中的-o选项 –

6

使用getoptgetopts是更好的解决方案。但要回答您的直接问题,[email protected]全部为,因此-h -c与您的case语句中的任何单一参数模式都不匹配。你仍然需要遍历你的论点,像这样

for arg in "[email protected]"; do 
    case $arg in 
     .... 
    esac 
done 
+3

FWIW:'对于“$ @”中的arg; do ...'等同于'for arg;做...' –

0

解析位置参数像... $ 1,只是在案件语句使用$ 1,然后在最后...用途转移到休闲区的第二参数为1美元,同样如此。

还我会把情况下,语句在while循环或更好的FXN,这样我可以两个选项或选项的数目的两倍运行..........

$ #会让你知道有多少选项/参数。