Bash

如何在 bash 中使用 getopts

  • January 2, 2022

我是 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聲明了三個選項:-sand -rwith no argument, and -pwith an argument。您似乎只需要兩個選項,並且都不希望有參數,因此正確的規範是sr,而用法是script.sh script.sh -sorscript.sh -rscript.sh -rsorscript.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導致?。如果你這樣做,你應該在$ois時列印一條消息?。無論哪種方式,如果選項未知,您都應該以失敗狀態退出。

我修復的其他錯誤:

  • ;;case語法中添加了缺失。
  • exit 1在成功的情況下刪除。
  • 在變數替換周圍添加了缺失的雙引號
  • 在可能---.
  • 添加了錯誤處理。

請注意,它的拼寫是getopts,而不是getopt。有一個名為的單獨實用程序getopt具有相同的目的,但工作方式不同,並且更難使用。它也不支持單破折號引入的多字元選項,但它支持雙破折號引入的長選項。

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