![getopts选项处理,是否可以添加非连字符的[FILE]?](https://linux22.com/image/43088/getopts%E9%80%89%E9%A1%B9%E5%A4%84%E7%90%86%EF%BC%8C%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%B7%BB%E5%8A%A0%E9%9D%9E%E8%BF%9E%E5%AD%97%E7%AC%A6%E7%9A%84%5BFILE%5D%EF%BC%9F.png)
我正在使用getopts
所有需要高级选项解析的脚本,并且它与dash
.我熟悉标准的基本getopts
用法,由[-x]
和组成[-x OPTION]
。
是否可以解析这样的选项?
dash_script.sh FILE -x -z -o OPTION
## Or the inverse?
dash_script.sh -x -z -o OPTION FILE
答案1
脚本参数通常位于选项之后。查看任何其他命令(例如cp
或 )ls
,您会发现情况确实如此。
所以,要处理:
dash_script.sh -x -z -o OPTION FILE
您可以使用getopts
如下所示:
while getopts xzo: option
do
case "$option" in
x) echo "x";;
z) echo "z";;
o) echo "o=$OPTARG";;
esac
done
shift $(($OPTIND-1))
FILE="$1"
处理选项后,getopts
设置$OPTIND
为第一个非选项参数的索引,在本例中为FILE
。
答案2
Getopt 将重新排列参数并将所有非选项参数放在末尾,之后--
:
$ getopt -o a: -- nonoption-begin -a x nonoption-middle -a b nonoption-end
-a 'x' -a 'b' -- 'nonoption-begin' 'nonoption-middle' 'nonoption-end'
如果您确实需要知道非选项参数位于开头,您可以$1
在调用之前检查是否是一个选项,如果不是则提取它getopt
:
if [ ${1#-} = $1 ]; then
NONOPTION=$1
shift
fi
ARGS=$(getopt ...)