能否使用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)。
我尝试过搜索,但没有找到答案。
您可以连接提供的选项,getopts
将对它们进行分离。在您的case
语句中,您将单独处理每个选项。
当看到选项时,您可以设置一个标志,并检查以确保在getopts
循环完成后存在必需的“选项”(!)。
以下是一个示例:
#!/bin/bash
rflag=false
small_r=false
big_r=false
usage () { echo "How to use"; }
options=':ij:rRvhm'
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: -$option" >&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
这是一个完整的getopts
函数的参考实现,但仅是更大脚本的简要概述。
$options
中的选项字符匹配但在case
语句中没有条目的选项,而后者提供了一个不与$options
中任何字符匹配的选项。 - Dennis Williamson$
前缀来表示变量名;因此,您可以直接使用shift $((OPTIND-1))
。 - kbolino* ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
应该写成-$option
而不是-$OPTARG
,否则它会说未实现选项的 参数 而不是未实现选项的 _标志_。使用-$OPTARG
的原始方式:./foo.bash -m foo Unimplemented option: -foo
如果使用-$option
您将得到期望的结果:./foo -m foo Unimplemented option: -m
- Elven Spellmaker