コマンドを最初の位置パラメーターとして受け取り、次のようなディスパッチとしてcase構文を使用するbashスクリプトを作成しました。
do_command() {
# responds to invocation `$0 command ...`
}
do_copy() {
# respond to invocation: `$0 copy...`
}
do_imperative() {
# respond to invocation: `$0 imperative ...`
}
cmd=$1
shift
case $cmd in
command)
do_command $*
;;
copy)
do_copy $*
;;
imperative)
do_imperative $*
;;
*)
echo "Usage: $0 [ command | copy | imperative ]" >&2
;;
esac
このスクリプトは、呼び出す関数を決定し$1
、残りの引数をその関数に渡します。個別の部分一致に能力ディスパッチを追加したいのですが、エレガントな方法でそれを実行したいと思います(エレガントとは、読みやすく、目障りや気を散らすほど冗長ではない方法として定義されます)。
明らかに機能している(ただしエレガントではない)ソリューションは、次のようになります。
case $cmd in
command|comman|comma|comm|com)
do_command $*
;;
copy|cop)
do_copy $*
;;
imperative|imperativ|imperati|imperat|impera|imper|impe|imp|im|i)
do_imperative $*
;;
*)
echo "Usage: $0 [ command | copy | imperative ]" >&2
;;
esac
ご覧のとおり、各コマンド名のすべての異なる順列を明示的に列挙すると、非常に面倒になる可能性があります。
しばらくの間、次のようなワイルドカード一致を使用しても問題ないと思いました。
case $cmd in
com*)
do_command $*
;;
cop*)
do_copy $*
;;
i*)
do_imperative $*
;;
*)
echo "Usage: $0 [ command | copy | imperative ]" >&2
;;
esac
これは目障りではありません。ただし、これにより、 「comblah」として指定さdo_command
れたときに呼び出される場所$1
や、有効な引数として認識されるべきではない他の何かなど、望ましくない動作が発生する可能性があります。
私の質問は次のとおりです。ユーザーが期待されるコマンドの明確な切り捨てられた形式を提供できる場合に、そのようなコマンドを正しくディスパッチするための最も洗練された(上記で定義された)方法は何ですか?