getopts
これは、多かれ少なかれあなたがやりたいように使用し、実行する私のシェルスクリプトの断片です:
arg0=$(basename $0 .sh)
usage()
{
echo "Usage: $arg0 [-qvF] [-s suffix] -j jdcfile file.msd" 1>&2
exit 1
}
error()
{
echo "$arg0: $*" 1>&2
exit 1
}
Fflag=
suffix=
jdcfile=
qflag=
vflag=no
while getopts Fj:qs:v opt
do
case "$opt" in
(F) Fflag="-F";;
(j) jdcfile="$OPTARG";;
(q) qflag="-q";;
(s) suffix="$OPTARG";;
(v) vflag=yes;;
(*) usage;;
esac
done
shift $(($OPTIND - 1))
case $# in
(1) : OK;;
(*) usage;;
esac
if [ -z "$jdcfile" ]
then error "you did not specify which jdcfile to use (-j option)"
fi
msd_file=$1
あなたshift
が欠けている部分だと思います。getopts
それと、処理ループ後のコマンドラインでの残りの引数の後続の処理。
この特定のプログラムの最後には、"$@"
処理すべきファイル名が 1 つだけあります。この特定のプログラムでは、ファイルがまったくないか、複数のファイルがリストされているとエラーになります。その最終版を削除するcase
か、必要に応じて変更することができます。-j jdcfile
このコードは「オプション」も強制します。使用法メッセージに示されているように、これは必須の引数です。
の後のより典型的なパターンは次のshift
ようになります。
for file in "$@"
do
...processing of $file...
done
これでは、ファイル名がゼロの場合に対処する必要があります。
および関数はerror
、usage
有用なアウトライン/プロトタイプでもあります。:
コメントに記載されているように、オプション文字列の先頭を希望する場合は、エラー処理を担当できます。私はそうしないことを選択しましたが、それが私が下した決定であることを忘れていました.