[英]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.