Bash案例陈述

bsm*_*moo 11 bash shell case

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

我从下面开始

#!/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
Run Code Online (Sandbox Code Playgroud)

我想使用以下两个选项:

./getopts.sh -h -c
Run Code Online (Sandbox Code Playgroud)

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

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

我想构建一个脚本,如果你输入一个选项会做一些事情但是如果你输入多个就做多件事.

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

谢谢!

Bru*_*ett 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
Run Code Online (Sandbox Code Playgroud)


che*_*ner 6

使用getopt或是getopts更好的解决方案.但是要回答你的直接问题,那$@就是你的所有论证,-h -c这与你的case语句中的任何单参数模式都不匹配.您仍然需要像这样迭代您的参数

for arg in "$@"; do
    case $arg in
       ....
    esac
done
Run Code Online (Sandbox Code Playgroud)

  • FWIW:`for arg in"$ @"; do ...`相当于`for arg; 做......` (3认同)