Zsh

當沒有提供選項或參數時,如何使用 getopts 執行指定的程式碼塊?

  • January 24, 2012

所以我正在編寫一個腳本,將帶有參數的選項與不帶參數的選項混合在一起。從研究中我發現 getopts 是做到這一點的最佳方法,到目前為止,它很容易弄清楚和設置。我遇到的問題是弄清楚如何設置它,以便如果沒有提供選項或參數,它可以執行一組單獨的命令。這就是我所擁有的:

while getopts ":n:h" opt; do
 case $opt in
   n)
     CODEBLOCK >&2
     ;;
   h)
     echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
     exit 1
     ;;
   \?)
     echo "Invalid option: -$OPTARG" >&2
     exit 1
     ;;
   :)
     echo "Option -$OPTARG requires an argument." >&2
     exit 1
     ;;
 esac
done

我嘗試在程式碼頂部添加類似這樣的內容以不擷取任何參數,但是即使提供了選項和參數,它也會執行相同的程式碼(我的語法可能有問題):

[[ -n "$1" ]] || {
CODEBLOCK1
}

while getopts ":n:h" opt; do
 case $opt in
   n)
     CODEBLOCK2 >&2
     ;;
   h)
     echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
     exit 1
     ;;
   \?)
     echo "Invalid option: -$OPTARG" >&2
     exit 1
     ;;
   :)
     echo "Option -$OPTARG requires an argument." >&2
     exit 1
     ;;
 esac
done

getopts 的手冊頁很少,我在搜尋中發現的範例相對較少,這些範例可以提供對 getopts 的任何見解,更不用說它的所有各種功能了。

$1當為空時,您可以使用以下任何一種來執行命令:

[[ ! $1 ]] && { COMMANDS; }
[[ $1 ]] || { COMMANDS; }
[[ -z $1 ]] && { COMMANDS; }
[[ -n $1 ]] || { COMMANDS; }

此外,您不需要在此特定範例中引用擴展,因為不執行分詞。

但是,如果您想檢查是否有參數,最好使用(( $# )).

如果我理解您的意圖,以下是您的程式碼的編寫方式getopts

#!/bin/bash

(( $# )) || printf '%s\n' 'No arguments'

while getopts ':n:h' opt; do
   case "$opt" in
       n)
           [[ $OPTARG ]] && printf '%s\n' "Commands were run, option $OPTARG, so let's do what that says."
           [[ ! $OPTARG ]] && printf '%s\n' "Commands were run, there was no option, so let's run some stuff."
           ;;
       h) printf '%s\n' 'Help printed' ;;
       *) printf '%s\n' "I don't know what that argument is!" ;;
   esac
done

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