当我在Bash函数中使用getopts时,为什么它会忽略第二次调用的参数?

时间:2014-06-08 20:39:02

标签: bash getopts

以下是我的代码

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

所以,我在第二次打电话时失去了价值。

任何人都知道为什么会这样吗?

我也试过没有局部变量。

1 个答案:

答案 0 :(得分:2)

基本问题是getopts使用全局变量OPTIND来跟踪其进度。 shell启动时OPTIND设置为1,getopts使用getopt来标识应该解析哪个参数。在OPTIND扫描完所有选项后,shift $((OPTIND-1))是第一个位置参数的索引,这就是OPTIND有效的原因。

正如bash manual所说:

  

shell不会自动重置getopts;如果要使用一组新参数,则必须在同一shell调用中多次调用{{1}}之间手动重置。