没有可选参数的GETOPTS案例

时间:2014-03-23 20:46:27

标签: bash

您好我试图找到一种方法,让getopts可以使用非预期的可选参数

我有一个带有可选参数的脚本

script.sh [-a] [-b] [-c | -d] file

我使用-a ..- d喜欢这个

while geopts abc:abd opt
do 
case $opt in
a) do this ;;
b) do this ;;
...

..等等

我想这样做它可以在没有这些参数的情况下工作,所以我可以像这样运行它

script.sh file

有没有办法制作新案例选项,或者我需要以其他方式执行此操作,感谢所有帮助,我是bash的初学者。

2 个答案:

答案 0 :(得分:1)

我之前做过这样的事情:

declare -A have=([a]=false [b]=false [c]=false [d]=false)

while geopts :abcd opt; do 
    case $opt in
        a) have[a]=true ;;
        b) have[b]=true ;;
        c) have[c]=true ;;
        d) have[d]=true ;;
        ?) echo "illegal option: -$OPTARG"; exit 1;;
    esac
done
shift $((OPTIND-1))

if ${have[c]} && ${have[d]}; then 
    echo "cannot give both -c and -d"
    exit 1
fi

${have[a]} && do_a_stuff
${have[b]} && do_b_stuff
...

那个案例陈述是一个非常令人震惊的剪辑编程:加强它:

while geopts :abcd opt; do 
    case $opt in
        a|b|c|d) have[$opt]=true ;;
        ?) echo "illegal option: -$OPTARG"; exit 1;;
    esac
done

答案 1 :(得分:1)

我有以下测试脚本:

#! /bin/bash

USAGE="test.sh [-a] [-b] [-c | -d ]"

while getopts :abcd option
do
    case $option in
        a) OPT_A=1;;
        b) OPT_B=1;;
        c) OPT_C=1;;
        d) OPT_D=1;;
        *)
            echo "$OPTARG is not a valid option."
            echo "$USAGE"
            exit 2;;
    esac
done
shift $((OPTIND-1))

if [[ $OPT_C && $OPT_D ]]
then
    echo "That's a no-no using options c and d together"
    echo "$USAGE"
    exit 2
fi

echo "The following options were set"
[[ $OPT_A ]] && echo "    Option A was set"
[[ $OPT_B ]] && echo "    Option B was set"
[[ $OPT_C ]] && echo "    Option C was set"
[[ $OPT_D ]] && echo "    Option D was set"
echo "And the file name is $1"

它将显示已设置的选项(以及哪些选项不是)。它会进行测试,以确保-c-d不会一起使用。

不是100%肯定你要求的。但是,您可以看到,在我的case语句中,我不是说执行此操作,而是仅设置显示已选择或未选择的选项的变量。这本身就解决了你的问题。