bash getopts有多个和强制选项

Ram*_*ane 38 bash getopts

是否可以使用getopts一起处理多个选项?例如,myscript -iR或myscript -irv.

此外,我有一种情况,基于条件脚本将需要强制选项.例如,如果脚本的参数是一个目录,我将需要指定-R或-r选项以及任何其他选项(myscript -iR mydir或myscript -ir mydir或myscript -i -r mydir或myscript -i -R mydir),如果只有文件-i就足够了(myscript -i myfile).

我试图搜索但没有得到任何答案.

Pau*_*ce. 94

您可以连接您提供的选项getopts并将它们分开.在您的case陈述中,您将单独处理每个选项.

您可以在看到选项时设置标志,并检查以确保在getopts循环完成后存在必需的"选项"(!).

这是一个例子:

#!/bin/bash
rflag=false
small_r=false
big_r=false

usage () { echo "How to use"; }

options=':ij:rRvh'
while getopts $options option
do
    case "$option" in
        i  ) i_func;;
        j  ) j_arg=$OPTARG;;
        r  ) rflag=true; small_r=true;;
        R  ) rflag=true; big_r=true;;
        v  ) v_func; other_func;;
        h  ) usage; exit;;
        \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
        :  ) echo "Missing option argument for -$OPTARG" >&2; exit 1;;
        *  ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
    esac
done

if ((OPTIND == 1))
then
    echo "No options specified"
fi

shift $((OPTIND - 1))

if (($# == 0))
then
    echo "No positional arguments specified"
fi

if ! $rflag && [[ -d $1 ]]
then
    echo "-r or -R must be included when a directory is specified" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

这表示getopts函数的完整参考实现,但仅是较大脚本的草图.

  • 请注意,您不必在算术块中使用`$`作为变量名称的前缀; 所以你可以做`shift $((OPTIND-1))` (3认同)
  • 顺便说一句 `* ) echo "未实现的选项: -$OPTARG" >&2; exit 1;;` 应该声明 `-$option` 而不是 `-$OPTARG`,否则它表示该选项的 _argument_ 未实现,而不是 _flag_ 未实现。使用 `-$OPTARG` 的原始方式:` ./foo.bash -m foo 未实现的选项:-foo ` 如果使用 `-$option`,您会得到预期的结果:` ./foo -m foo 未实现的选项:-m ` (2认同)