getopts 可选参数_使用getopts的读取一个可选参数放在为final的地方

I wrote a bash script that takes flexible number of parameters and now I would like to add an optional argument (-l) to each of them.

I am currently having difficulty getting the desired behavior.

I want all of the following to execute correctly:

./Script.sh arg1 arg2 arg3 -l opt

./Script.sh arg1 arg2 arg3

./Script.sh arg1 arg2 arg3 arg4 -l opt

./Script.sh arg1 arg2 arg3 arg4 arg5

The problem is that $OPTIND cannot be set.

The following loop works if the -l opt is placed before first argument.

while getopts ":l:" option

do

case "$option" in

t)

F_NAME=$OPTARG

;;

esac

done

shift $((OPTIND - 1))

However, place the optional -l as last parameter is a requirement.

What's the easiest way to achieve this?

解决方案

Here is a trick I have found to use arguments with optional parameters with getopts.

The way to manage the case where the optional parameter is inside the command is given by Jan Schampera in is reply on bash-hackers.org :

if [[ $OPTARG = -* ]]; then

((OPTIND--))

continue

fi

(see : http://wiki.bash-hackers.org/howto/getopts_tutorial deep in the page)

But it does not manage the case where the option is given at the end of the command.

In that case, that is considered wrong because no parameter is given, getopts set the opt variable to ':' (colon) and OPTARG to the fault option value.

So we have to manage the ':' case, with a case $OPTARG.

Let us say we write a script having three options :

a : without parameter

b : with a required parameter

v : to set the verbosity with a value from 0 to 2. The default value is 0 and a preset value us used when the script is call with -v without parameter or with a bad value.

Here is the code :

#!/bin/bash

VERBOSITY=0 # default verbosity set to 0

PRESET_VERBOSITY=1 # preset verbosity when asked

while getopts :ab:v: opt; do

case $opt in

a)

echo "manage option a"

;;

b)

echo "manage option b with value '$OPTARG'"

;;

v)

if [[ $OPTARG = -* ]]; then # Jan Schampera reply

echo "set verbosity to PRESET (no value given, not last position)"

VERBOSITY=$PRESET_VERBOSITY

((OPTIND--))

continue

fi

if [[ "$OPTARG" =~ ^[0-2]$ ]]; then

echo "set verbosity to $OPTARG (good value given)"

VERBOSITY=$OPTARG

else

echo "set verbosity to PRESET (bad value given)"

VERBOSITY=$PRESET_VERBOSITY

fi

;;

:)

case $OPTARG in

v)

echo "set verbosity to PRESET (no value given, last option)"

VERBOSITY=$PRESET_VERBOSITY

;;

esac

;;

\?)

echo "WTF!"

;;

esac

done

echo "**verbosity is set to $VERBOSITY**"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值