11

我正在尝试学习案例,因为我要编写一个功能齐全的脚本。

我从下面开始

#!/bin/sh
case $@ 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 ?

谢谢!

4

3 回答 3

12

尝试这个

#!/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
于 2013-05-22T01:59:59.797 回答
6

使用getoptorgetopts是更好的解决方案。但是要回答您的直接问题,您$@所有论点 so-h -c与您的案例陈述中的任何单论元模式都不匹配。你仍然需要像这样迭代你的论点

for arg in "$@"; do
    case $arg in
       ....
    esac
done
于 2013-05-21T15:43:42.103 回答
0

要解析诸如 ... $1 之类的位置参数,只需在案例 stmt 中使用 $1 ,然后在最后 ... 使用 shift 将第二个参数推到 $1 ,同样地。

我也将案例 stmt 放在一个 while 循环或更好的 fxn 中,以便我可以针对两个选项或选项数量运行它两次............

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

于 2013-05-21T15:46:50.843 回答