簡體   English   中英

使用bash訪問getopts選項中的第二個參數

[英]Access second argument in getopts option using bash

幾天前在這里已經提出的相關問題

但是這次條件不同,使用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的選擇嗎?

也有人對問題的詢問讓我知道,坦白地說,解決方案的意思是非常簡單或困難,但目前我不知道。

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
    ;;

與上場后最后OPTIND發現得到it.Modified的方式-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++))
    ;;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM