在shell上使用像getopt这样的getopts

时间:2014-11-07 04:01:44

标签: bash shell getopt getopts

系统:freebsd 9.2

我想使用getopts来解析命令行。如

./tesh.sh -o good a.c  
can get  good.out

./tesh.sh -o a.c   
can get a.out

但是在getopts中没有“选项”变量。 有谁知道如何解决这个问题? 我发现了很多网页,但没人能解决。

这是我的代码

#!/bin/bash


while getopts "hs:o:" optname
do
    case "$optname" in
    "h")
        echo "Option $optname is specified"
        ;;
    "s")
        echo "Option $optname has value $OPTARG"
        ;;
    "o")    
        echo "$optname"
        ;;
    "?")
        echo "Unknown option $OPTARG"
        ;;
    ":")
    ;;
    *)
        # Should not occur
        echo "Unknown error while processing options"
        ;;
    esac
    echo "OPTIND is now $OPTIND"
done    

如果我输入./test.sh -o a.c 它将打印echo“$ optname”

我希望如此 如果我输入 ./test.sh -o 也可以打印echo“$ optname”

现在它会打印错误信息

THX!

1 个答案:

答案 0 :(得分:0)

根据您的要求,您无需使用getopts,您可以使用以下代码来实现它。

如果只给出-o,它将被视为标志。 如果-o是任意值的givne,则将其视为选项。

> cat test
#!/bin/bash

while [ $# -gt 0 ]; do
case $1 in
        -h) echo "Option $optname is specified" ;;
        -s) VAL_S=$2; echo "Option $optname has value $VAL_S" ;shift;;
        -o) VAL_O=$2; F=$(echo $VAL_O |cut -c1);
            if [ "$F" = "-" -o -z "$F" ]; then
                echo "-o is a flag"
                DEFAULT=a.c
            else
                echo "-o is a option"
                DEFAULT=$VAL_O
                shift
            fi
        ;;
        *) echo "Unknown option $OPTARG" ;exit ;;
esac
shift
done

我在可能的情况下运行它。

> ./test -o
-o is a flag
> ./test -o a.c
-o is a option
> ./test -o -h
-o is a flag
Option  is specified
> ./test -o a.c -h
-o is a option
Option  is specified