以下是我的代码
function waitTillGWState
{
if [[ $# -lt 6 ]] ; then
echo "$FUNCNAME:: Wrong parameter specified. Exiting."
exit 1
fi
local Fname1
local fset
local state
local lhost
echo "$# $@"
waitTillGWState_Usage() { echo "waitTillGWState: [-F <Fname1> -t <Fname2> -S <state> -h <host>]" 1>&2; exit; }
while getopts F:t:S:h: x; do
case ${x} in
F)
Fname1="${OPTARG}"
echo "Value of Fname1 is $Fname1"
;;
t)
Fname2="${OPTARG}"
echo "Value of Fname2 is $Fname2"
;;
S)
state="${OPTARG}"
echo "Value of state is $state"
;;
h)
lhost="${OPTARG}"
echo "Value of lhost is $lhost"
;;
*)
waitTillGWState_Usage
;;
esac
done
shift $((OPTIND-1))
echo "Values are $Fname1 $Fname2 $state $lhost"
if [[ -z "${lhost}" ]] ; then
lhost=`hostname`
fi
echo "Values are $Fname1 $Fname2 $state $lhost"
return 0
}
waitTillGWState -F Fname1 -t X4 -S Active
waitTillGWState -F Fname1 -t X4 -S Disconnectecd
现在,当我运行它时,这是第一次完美的工作。但第二次失去了价值观。
+ waitTillGWState -F Fname1 -t X4 -S Active
+ [[ 6 -lt 6 ]]
+ local Fname1
+ local fset
+ local state
+ local lhost
+ echo '6 -F' Fname1 -t X4 -S Active
6 -F Fname1 -t X4 -S Active
+ getopts F:t:S:h: x
+ case ${x} in
+ Fname1=Fname1
+ echo 'Value of Fname1 is Fname1'
Value of Fname1 is Fname1
+ getopts F:t:S:h: x
+ case ${x} in
+ Fname2=X4
+ echo 'Value of Fname2 is X4'
Value of Fname2 is X4
+ getopts F:t:S:h: x
+ case ${x} in
+ state=Active
+ echo 'Value of state is Active'
Value of state is Active
+ getopts F:t:S:h: x
+ shift 6
+ echo 'Values are Fname1 X4 Active '
Values are Fname1 X4 Active
+ [[ -z '' ]]
++ hostname
+ lhost=p7fbn11
+ echo 'Values are Fname1 X4 Active p7fbn11'
Values are Fname1 X4 Active p7fbn11
+ return 0
+ waitTillGWState -F Fname1 -t X4 -S Disconnectecd
+ [[ 6 -lt 6 ]]
+ local Fname1
+ local fset
+ local state
+ local lhost
+ echo '6 -F' Fname1 -t X4 -S Disconnectecd
6 -F Fname1 -t X4 -S Disconnectecd
+ getopts F:t:S:h: x
+ shift 6
+ echo 'Values are X4 '
Values are X4
+ [[ -z '' ]]
++ hostname
+ lhost=myhost1
+ echo 'Values are X4 myhost1'
Values are X4 myhost1
+ return 0
所以,我在第二次打电话时失去了价值。
任何人都知道为什么会这样吗?
我也试过没有局部变量。
答案 0 :(得分:2)
基本问题是getopts
使用全局变量OPTIND
来跟踪其进度。 shell启动时OPTIND
设置为1,getopts
使用getopt
来标识应该解析哪个参数。在OPTIND
扫描完所有选项后,shift $((OPTIND-1))
是第一个位置参数的索引,这就是OPTIND
有效的原因。
正如bash manual所说:
shell不会自动重置
getopts
;如果要使用一组新参数,则必须在同一shell调用中多次调用{{1}}之间手动重置。