Bash

如何檢測到 getopts 沒有傳遞任何選項?

  • April 21, 2020

我有這個程式碼 -

#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而不是呼叫 function usage。當給出除 w、h 和 l 以外的選項時,它會呼叫用法。那麼當沒有指定選項時它不能工作。

我已經嘗試使用?, \?,:代替,*但我無法實現我想要的。我的意思是所有docs關於getopt它的使用?

我究竟做錯了什麼?

當你在沒有任何選項的情況下執行這個腳本時,getopt 將返回 false,因此它根本不會進入循環。它只會下降到列印 - 這是ksh/zsh嗎?

如果你必須有一個選項,你最好的辦法是在循環之後測試 $name 。

if [ -z "$name" ]
then
  usage
  exit
fi

但是在呼叫之前確保$name是空getopts的(因為在環境中可能有一個$nameshell 在啟動時收到的)

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未設置(並註意先取消設置)

引用自:https://unix.stackexchange.com/questions/50563