Bash
如何在 bash 中使用 getopts
我是 bash 腳本的新手,我正在嘗試使用 getopts 編寫腳本,以便在
script.sh -sp
呼叫時 URL 和列數和行數被列印出來。並且當script.sh -r
呼叫選項時,僅列印文件類型。腳本 :
#!/bin/bash #define the URL URL='https://github.com/RamiKrispin/coronavirus/tree/master/data_raw' #define file name filename=$(basename "$URL") #dowload the file wget -q "${URL}" while getopts ":sp:r" o; do case $o in sp ) echo URL: $URL #print the URL address awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' $filename #print the column count and row count r ) file $filename #print the file type exit 1 esac done
誰能幫我理解如何正確使用 getopts?
getopts
只支持單字元的選項名,支持集群:-sp
相當於不帶參數的單獨傳遞-s
和-p
單獨傳遞,如果帶參數就是帶參數的選項。這是類 Unix 系統上的正常約定:在單個 dash 之後,每個字元都是一個單獨的選項(直到一個帶有參數的選項);在雙破折號之後,所有(最多)都是選項名稱。-s``-s``p``-s``-``--``=
所以
getopts ":sp:r" o
聲明了三個選項:-s
and-r
with no argument, and-p
with an argument。您似乎只需要兩個選項,並且都不希望有參數,因此正確的規範是sr
,而用法是script.sh
script.sh -s
orscript.sh -r
或script.sh -rs
orscript.sh -r -s
等。while getopts sr o; do case $o in s) echo "URL: $URL" #print the URL address awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' -- "$filename" #print the column count and row count ;; r) file -- "$filename";; #print the file type \?) exit 3;; #invalid option esac done shift $((OPTIND - 1)) # remove options, keep non-option arguments if [ $# -ne 0 ]; then echo >&2 "$0: unexpected argument: $1" exit 3 fi
領導
:
說不要向使用者報告未知選項。未知的選項仍然會$o
導致?
。如果你這樣做,你應該在$o
is時列印一條消息?
。無論哪種方式,如果選項未知,您都應該以失敗狀態退出。我修復的其他錯誤:
;;
在case
語法中添加了缺失。exit 1
在成功的情況下刪除。- 在變數替換周圍添加了缺失的雙引號。
- 在可能
--
以-
.- 添加了錯誤處理。
請注意,它的拼寫是
getopts
,而不是getopt
。有一個名為的單獨實用程序getopt
具有相同的目的,但工作方式不同,並且更難使用。它也不支持單破折號引入的多字元選項,但它支持雙破折號引入的長選項。