Bashでgetoptを使用する方法

Bashでgetoptを使用する方法

私はbashスクリプトが最初に呼び出されたときにscript.sh -sp列と行数を持つURLを印刷するgetoptsを使用してスクリプトを作成しようとしています。オプションが呼び出されると、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を正しく使用する方法を理解するのに役立つ人はいますか?

答え1

getopts単一文字オプション名のみがサポートされ、クラスタリングがサポートされます。パラメータがない場合は-sp渡すのと同じで-s、パラメータがある場合はパラメータがあるオプションです。これはUnixシリーズシステムの一般的なルールです。ダッシュの後の各文字は、別のオプション(引数のあるオプションまで)です。二重ダッシュの後のすべての文字(最大)はオプション名です。-p-s-sp-s---=

したがって、パラメータなしオプションとパラメータ埋め込みオプションのgetopts ":sp:r" o3つのオプションが宣言されます。 2つのオプションしか必要とせず、どちらも引数を必要としないので、正しい仕様は使い方がorまたはorです。-s-r-psrscript.sh script.sh -sscript.sh -rscript.sh -rsscript.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メッセージを印刷する必要があります?。どちらもオプションがわからない場合は、失敗状態で終了する必要があります。

私が修正した他のバグ:

  • ;;文法に欠けている内容を追加しましたcase
  • exit 1成功したケースから削除されました。
  • 次へ追加変数の置換に二重引用符がありません。
  • --で始まる可能性があるコマンドパラメータの前に欠落している部分が追加されました-
  • エラー処理が追加されました。

getoptsではなくと表記されることに注意してくださいgetoptgetopt同じ目的を果たしますが、動作が異なり、使いにくい別のユーティリティがあります。また、単一ダッシュで始まる複数文字オプションはサポートされていませんが、デュアルダッシュで始まる長いオプションはサポートされています。

関連情報