簡體   English   中英

Bash-使用帶有多個參數的getops

[英]Bash - using getops with multiple arguments

我有以下代碼:

while getopts ":vh" opt; do
        case $opt in
         (h)
                helpMe
                exit 0
         ;;
         (v)
                version1
                exit 0
         ;;
         \?)
                echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2
                exit 1
        ;;
        esac
done

此代碼應僅獲得標志“ h”和“ v”。 但是當我舉個例子'hg'時,我仍然得到幫助輸出。 另外,當我給標志“ va”時,我仍然得到版本輸出。 我要說的是我的腳本忽略了所需字母之后的所有字母。

為什么會發生? 有人可以請教嗎?

謝謝。

循環一次解析和處理一個選項,而-hg被視為兩個單獨的選項-h-g 由於循環首先遇到-h因此它將觸發helpMe並退出,而無需解析-g 如果要使用-gh運行腳本, -gh在它命中-g選項時看到失敗,因為在這種情況下它首先出現。

如果您不喜歡這種行為,則可以使用變量來存儲狀態,讓getopts完成解析並隨后對-h測試:

while getopts ":vh" opt; do
    case $opt in
        h)
            opt_h=true
            ;;
        [...]
    esac
done

if [ "${opt_h}" = true ]; then
    helpMe
    exit 0
fi

這是您選擇exit的電話。 getopts將一次處理一個參數因此,當它在-h -g-hg的擴展-hg )中-hg h時,它將運行helpMe然后退出。

這意味着它將永遠不會在選項中找到-g

處理此問題的最簡單方法是,在-h上簡單聲明,它將輸出幫助文本並退出,而不管是否存在其他任何參數。

如果要確保參數有效,只需將其狀態存儲在選項檢查代碼中,然后再處理即可

這樣,檢查將在執行任何操作之前完成。 像這樣:

flag_v=0
flag_h=0
while getopts ":vh" opt; do
        case $opt in
         (h)
                flag_h=1
         ;;
         (v)
                flag_v=1
         ;;
         \?)
                echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2
                exit 1
        ;;
        esac
done

if [[ $flag_h -eq 1 ]] ; then
    helpMe
    exit 0
fi
if [[ $flag_v -eq 1 ]] ; then
    showVersion
    exit 0
fi

# Now continue, neither h nor v was specified.

如果指定-h-hv ,將提供幫助並退出,如果指定-v ,版本信息將退出,如果提供任何其他選項,則退出並顯示錯誤。

如果未指定任何選項,它將僅在注釋之外繼續執行腳本要執行的操作。

暫無
暫無

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

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