Bash
如何檢測到 getopts 沒有傳遞任何選項?
我有這個程式碼 -
#getoptDemo.sh usage() { echo "usage: <command> options:<w|l|h>" } while getopts wlh: option do case $option in (w) name='1';; (l) name='2';; (h) name='3';; (*) usage exit;; esac done print 'hi'$name
當我執行
bash getoptDemos.sh
(沒有選項)時,它會列印hi
而不是呼叫 functionusage
。當給出除 w、h 和 l 以外的選項時,它會呼叫用法。那麼當沒有指定選項時它不能工作。我已經嘗試使用
?
,\?
,:
代替,*
但我無法實現我想要的。我的意思是所有docs
關於getopt
它的使用?
。我究竟做錯了什麼?
當你在沒有任何選項的情況下執行這個腳本時,getopt 將返回 false,因此它根本不會進入循環。它只會下降到列印 - 這是ksh/zsh嗎?
如果你必須有一個選項,你最好的辦法是在循環之後測試 $name 。
if [ -z "$name" ] then usage exit fi
但是在呼叫之前確保
$name
是空getopts
的(因為在環境中可能有一個$name
shell 在啟動時收到的)unset name
(
getopts
循環前)
getopts
依次處理選項。這就是它的工作。如果使用者碰巧沒有傳遞任何選項,則第一次呼叫getopts
退出 while 循環。如果沒有選項帶參數,則值
OPTIND
表示傳遞了多少選項。通常,OPTIND
是選項或選項參數的參數數量,而不是非選項參數(操作數)。while getopts …; do …; done if [ $OPTIND -eq 1 ]; then echo "No options were passed"; fi shift $((OPTIND-1)) echo "$# non-option arguments"
在任何情況下,您都不是試圖確定是否沒有選項,而是是否沒有通過
name
-setting 選項。所以檢查是否name
未設置(並註意先取消設置)。