getopts - 如果标志为空,则getopts使用下一个标志

时间:2015-12-29 09:24:03

标签: bash getopts

我试图将getopts用于bash脚本。此脚本可以有标志,所有这些标志都是必需的,需要包含一个值。当其中一个应该包含值的强制标志为空时,getopts使用next-in-line标志作为其内容。我该如何防止这种情况?

这是我的例子:

#!/bin/bash

while getopts "A:B:" OPTION
do
        case $OPTION in
        A)
        GILIA="$GILIA $OPTARG"
        echo GILIA $GILIA
        ;;
        B)
        GILIB="$GILIB $OPTARG"
        echo GILIB $GILIB
        ;;
        esac
done

使用带有值的两个标志时:

./test_opt2 -A aaa -B bbb
GILIA aaa
GILIB bbb

使用" -A"国旗空:

./test_opt2 -A  -B bbb
GILIA -B

我知道这是getopts的正常/典型行为,我确信有办法解决这个问题...

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以做的是检查$ OPTARG的值。如果它以-开头,则减小索引$ OPTIND的值,以便下次循环时选择-参数作为OPTION。

在第二个示例中,处理空-A参数时,$ OPTIND将设置为3.我的代码会将值设置回2,以便下一步处理-B

    case $OPTION in
    A)
        arg=${OPTARG#-}
        if [ $arg == $OPTARG ]
        then
            GILIA="$GILIA $OPTARG"
            echo GILIA $GILIA
        else
            echo "-A needs argument"
            OPTIND=$OPTIND-1
        fi
        ;;

答案 1 :(得分:2)

如果您想将空白参数传递给-A,那么:

./test_opt2 -A '' -B bbb

如果您希望脚本在没有参数的情况下接受-A,请更改脚本:

while getopts "AB:" OPTION

然后脚本会期望-A永远不会参与。

答案 2 :(得分:2)

假设:(1)所有选项都是必需的,(2)任何参数都不能以' - '开头。然后我会用这样的东西:

while getopts ":a:b:" opt ; do
    [[ ${OPTARG} == -* ]] && { echo "Missing argument for -${opt}" ; exit 1 ; }
    case ${opt} in
        a ) gilia="$gilia $OPTARG"
            echo gilia $gilia
            ;;
        b ) gilib="$gilib $OPTARG"
            echo gilib $gilib
            ;;  
        \?) echo "Invalid (-${OPTARG}) option"
            ;;
        : ) echo "Missing argument for -${OPTARG}"
            ;;
    esac
done

你会得到:

$ ./t.sh -a aaa -b bbb 
gilia aaa
gilib bbb
$ ./t.sh -a -b bbb 
Missing argument for -a
$ ./t.sh -a aaa -b 
gilia aaa
Missing argument for -b
$ ./t.sh -a aaa -b bbb -c ccc
gilia aaa
gilib bbb
Invalid (-c) option