私は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
-s
p
-s
-
--
=
したがって、パラメータなしオプションとパラメータ埋め込みオプションのgetopts ":sp:r" o
3つのオプションが宣言されます。 2つのオプションしか必要とせず、どちらも引数を必要としないので、正しい仕様は使い方がorまたはorです。-s
-r
-p
sr
script.sh
script.sh -s
script.sh -r
script.sh -rs
script.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
ではなくと表記されることに注意してくださいgetopt
。getopt
同じ目的を果たしますが、動作が異なり、使いにくい別のユーティリティがあります。また、単一ダッシュで始まる複数文字オプションはサポートされていませんが、デュアルダッシュで始まる長いオプションはサポートされています。