使用bash访问getopts选项中的第二个参数

时间:2014-03-04 11:28:09

标签: linux bash shell getopts

前几天已经问过相关问题here

但这次条件不同,使用getopts

跟随bash脚本
#!/bin/bash
ipaddr=""
sysip=""
msgType=""
sshTimeout=""
bulbIndex=""
bulbstate=""
while getopts ":ht:d:A:r:s:m:" OPTION
do
    case $OPTION in
        h)
            usage $LINENO
            ;;

        t)
            let "t_count += 1"
            ipaddr="${OPTARG}"
            echo -e $ipaddr
            ;;

        d)
            let "d_count += 1"
            echo "Not supported"
            exit 0
            ;;

        A)
            let "A_count += 1"
            bulbIndex="${OPTARG}"  #  After -A option firsr argument is bulb index and second is state off/on
            bulbstate=$3
            printf "Set %s state on %s bulb\n" $bulbstate $bulbIndex
            ;;

        r)
            let "r_count += 1"
            sysip="${OPTARG}"
            echo -e $sysip
            ;;

        m)
            let "m_count += 1"     #message type 1:text 2:number 3:Text&number
            msgType="${OPTARG}"
            echo -e $msgType
            ;;

        s)
            let "s_count += 1"
            sshTimeout="${OPTARG}"
            echo -e $sshTimeout
            ;;

        ?)
            echo -e "wrong command sysntax"
            exit 0
            ;; 
    esac
done

上面的脚本适用于除-A选项之外的所有选项。它有什么问题让你知道从下面的脚本执行步骤

$ ./sample.bash -A 3 OFF
Set OFF state on 3 bulb

这是预期的输出,但是当我给出多个选项时,它表现得像

那样错误
$ ./sample.bash -t 192.168.0.1 -r 192.169.0.33 -A 3 OFF
192.168.0.1
192.169.0.33
Set -r state on 3 bulb

我希望OFF代替-r,显然它会提供此输出,因为这次它不是$3而是$7但我的问题是我如何通知脚本它现在$7不是$3

$ ./sample.bash -t 192.168.0.1 -A 3 OFF -r 192.169.0.33 -m 1
192.168.0.1
Set -A state on 3 bulb

这次-A之后所有选项都被丢弃,而-A再次OFF

如何在-A选项的任何序列中-A选项之后正确访问这两个参数?

任何人都有关于问题的询问让我知道,坦率地说,无论解决方案是什么意思都非常简单或困难,但目前我不知道。

2 个答案:

答案 0 :(得分:0)

getopts每个选项只接受一个参数。如何将两个参数传递给引号内的-A,稍后在case语句中将它们分开?

A)
    let "A_count += 1"
    bulbIndex=${OPTARG% O*}
    bulbstate=${OPTARG#* }
    printf "Set %s state on %s bulb\n" $bulbstate $bulbIndex
    ;;

然后使用:

进行呼叫
$ ./sample.bash -t 192.168.0.1 -r 192.169.0.33 -A "3 OFF"

给予:

192.168.0.1
192.169.0.33
Set OFF state on 3 bulb

如果您不能使用引号,那么如果您可以确保-A是最后使用的选项,那么您可以使用OPTARG获取数字,然后单独获取最终参数。

A)
    let "A_count += 1"
    bulbIndex="${OPTARG}"
    bulbstate=${@: -1}
    printf "Set %s state on %s bulb\n" $bulbstate $bulbIndex
    ;;

答案 1 :(得分:0)

最后在玩OPTIND之后找到了获取它的方法。在-A

中修改了getopts选项,如下所示
A)
    let "A_count += 1"
    let "index += $OPTIND" # where initial value of index is 2

    bulbstate=${!index}

    bulbIndex="${OPTARG}"

    printf "Set %s state on %s bulb\n" $bulbstate $bulbIndex

    ((OPTIND++))
    ;;