Zsh
當沒有提供選項或參數時,如何使用 getopts 執行指定的程式碼塊?
所以我正在編寫一個腳本,將帶有參數的選項與不帶參數的選項混合在一起。從研究中我發現 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