あなたは幻想に苦しんでいます。 getopts
を使用する場合は、フラグ文字を前に付ける必須の引数は必要ありません。スクリプトのコーパスから適切な例を見つけようとしました。これは半ば近似です。これはrcsunco
と呼ばれ、RCSからのチェックアウトを取り消すために使用されます。私はしばらくそれを修正していない、私は参照してください。私はそれをかなり頻繁に使用しています(RCSから完全に移行していないためです)。
#!/bin/sh
#
# "@(#)$Id: rcsunco.sh,v 2.1 2002/08/03 07:41:00 jleffler Exp $"
#
# Cancel RCS checkout
# -V print version number
# -n do not remove or rename checked out file (like SCCS unget) (default)
# -r remove checked out file (default)
# -k keep checked out file as $file.keep
# -g checkout (unlocked) file after clean-up
# -q quiet checkout
: ${RCS:=rcs}
: ${CO:=co}
remove=yes
keep=no
get=no
quiet=
while getopts gknqrV opt
do
case $opt in
V) echo "`basename $0 .sh`: RCSUNCO Version $Revision: 2.1 $ ($Date: 2002/08/03 07:41:00 $)" |
rcsmunger
exit 0;;
g) get=yes;;
k) keep=yes;;
n) remove=no;;
q) quiet=-q;;
r) remove=yes;;
*) echo "Usage: `basename $0 .sh` [-{n|g}][-{r|k}] file [...]" 1>&2
exit 1;;
esac
done
shift $(($OPTIND-1))
for file in $*
do
rfile=$(rfile $file)
xfile=$(xfile $rfile)
if $RCS -u $rfile
then
if [ $keep = yes ]
then
if [ -f $xfile ]
then
mv $xfile $xfile.keep
echo "$xfile saved in $xfile.keep"
fi
elif [ $remove = yes ]
then rm -f $xfile
fi
if [ $get = yes ] && [ $remove = yes -o $keep = yes ]
then $CO $quiet $rfile
fi
fi
done
これはほんの半近似です。オプションの引数の後にファイル名を指定しないと、スクリプトは静かに何もしません。しかし、必要な場合は、 'shift'の後に必須引数が存在することを確認することができます。私の別のスクリプトには必須の引数があります。
...
shift $(($OPTIND - 1))
case $# in
2) case $1 in
install) MODE=Installation;;
uninstall) MODE=Uninstallation;;
*) usage;;
esac;;
*) usage;;
esac
ので、そのコマンド(jlss
)は、このような-d $HOME
などのオプションの引数を取ることができますが、install
またはuninstall
のいずれかをインストールするには、何かの名前が続く必要があります。それは含まれています。
jlss install program
しかし、オプションのモードは次のとおりです:使用の基本的なモードがある
jlss -d $HOME -u me -g mine -x -p install program
それは約12のオプションがあるので、私はjlss
のすべてを示さなかった - それはrcsunco
ほどコンパクトではありませんが。
あなたはオプションの引数の前に必須の引数を扱っていた場合、あなたはもう少し作業を行う必要があるだろう:
- あなたがからそれらをシフトする、必須の引数を拾うと思います方法。
- 次に、オプションの引数をフラグとともに処理します。
- 最後に、適切な場合は、追加の 'ファイル名'引数を処理します。
オプション引数(必須のものの前と後ろの両方)に散在する必須の引数を扱っている場合は、さらに多くの作業が必要です。これは多くのVCSシステムで使用されています。 CVSとGITの両方が機能を持っている:
ここ
git -global option command [-sub option] [...]
、あなたはグローバルオプションを取得するために、1つのgetopts
ループを実行します。必須の議論を取り上げる。 2番目のgetopts
ループを実行してサブオプションを取得します(そして、 'ファイル名'引数を介して最終ループを実行することもできます)。
人生は楽しいものではありませんか?
これはまさに私が望むように見えます。しかし、これに関する1つの質問:引数をとるフラグ(たとえば、-l file.txt)を許可したい場合、構文は何ですか?再度、感謝します。 –
これについては、getoptのmanページを参照してください。簡単に:オプションにコロンを追加します(例: '" -rv:x "'、引数を取るにはvが必要です)。長いオプションもサポートされています。これは、getopts組み込み関数よりも優先されます。追加の非オプション引数を自分で処理する必要があることに注意してください。 – Sorpigal
ありがとうございました。優れた反応。 –