避免将选项自动作为参数

时间:2014-01-15 19:26:32

标签: bash

我想对我正在编写的bash脚本进行一些错误检查。特别是,我希望确保以下选项不被视为选项(故意)留空的论据。

让我们说下面的代码片段

while getopts “hhelpc1:2:” OPTION
do
     case "$OPTION" in
         h|help)
             usage
             exit 1
             ;;
         1)
             var1=${OPTARG}
             ;;
         2)
             var2=${OPTARG}
             ;;
         c)
             test1
             ;;
     esac
done

假设我的脚本名为test.sh

做类似

的事情
./test.sh -1 -2 dddd -c

在上述情况下,test1输出一个错误信息,即-2选项为空。相反,我想提出-1为空的警告,而目前-2将被视为-1的参数。

任何帮助?

由于 安德烈

1 个答案:

答案 0 :(得分:1)

getopts

  1. 只处理短选项名称,因此您不能在选项字符串中添加“帮助” - 这意味着您正在寻找“-h”,“ - e”,“ - l”,“ - p”
  2. 不能以你希望的方式寻找缺失的论据。您必须检查$ OPTARG以检查它是否是您的选项之一。
  3. 在opt字符串中添加前导:以自行处理getopts错误。

    这是你的代码的改造,我确信有很多我没有抓住的案例

    #!/bin/bash
    
    usage () { echo usage ...; }
    test1 () { echo test1; }
    
    shopt -s extglob
    
    while getopts ":hc1:2:" opt
    do
         case $opt in
             h)
                 usage
                 exit 1
                 ;;
             1)
                 case $OPTARG in
                     -[hc2]*)
                        echo "error: required argument missing for -1"
                        usage
                        exit 1
                        ;;
                     *) var1=$OPTARG
                        ;;
                 esac
                 ;;
             2)
                 case $OPTARG in
                     -[hc1]*)
                        echo "error: required argument missing for -2"
                        usage
                        exit 1
                        ;;
                     *) var2=$OPTARG
                        ;;
                 esac
                 ;;
             c)
                 test1
                 ;;
             :) 
                 echo "error: required argument missing for -$OPTARG"
                 usage
                 exit 1
                 ;;
             \?)
                 # unknown argument, handle accordingly
                 ;;
         esac
    done
    shift $((OPTIND - 1))
    
    echo "var1=$var1"
    echo "var2=$var2"
    echo "rest=$*"
    

    更新2014-01-23

    这是一种技巧:

    do_test1=false
    
    while getopts ...
        case $opt in
            ...
            c) do_test1=true ;;
            ...
        esac
    done
    shift $((OPTIND - 1))
    
    # execute function "test1" if "-c" was given:
    $do_test1 && test1