Bash case语句

12

我正在学习大小写,因为我想编写一个完全功能的脚本。

我从以下内容开始学习:

#!/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 解析到此脚本中,因为无论我首先输入哪个选项(-h),它都将成为 $1 ??

谢谢!


为什么不使用 getopts 而是使用 case - fedorqui
我对任何想法都持开放态度,因为我实际上都没有使用过。我需要学习这个,而不是拥有成千上万嵌套的 if 语句。 - bsmoo
即使使用了getopts,仍然需要一个循环(通常是while循环)和某种情况分析,而case比if ... elif ...更适合这个目的。@fedorqui - Uwe
3个回答

13

试一试

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

好的,看起来不错。我还有一个问题,如果我想让“-a”执行“whois $1”,我该如何实现呢?我希望使用方式为 ./script.sh -a example.com./script.sh -a -b example.com。你有什么建议吗? - bsmoo

6
使用 getoptgetopts 是更好的解决方案。但是回答您的直接问题,$@ 是您所有参数的集合,因此 -h -c 不符合您的 case 语句中任何单个参数模式。您仍需要像这样迭代处理您的参数。
for arg in "$@"; do
    case $arg in
       ....
    esac
done

3
FWIW:for arg in "$@"; do ... 等同于 for arg; do ... - Jeffrey Aguilera

0

要解析类似 $1 这样的位置参数,只需在 case 语句中使用 $1,然后在最后使用 shift 将第二个参数推到 $1 上,以此类推。

此外,我会将 case 语句放在 while 循环或更好的 fxn 中,这样我就可以为两个选项或选项数量运行两次它。

$# 将让您知道有多少选项/参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接