さまざまなオプションを許可するシェルスクリプトがあり、一部はパラメータがあり、一部はパラメータがなく、一部は短く、一部は長いです。これらのオプションの一部を自分で処理し、残りの部分を管理する方法がわからない他のプログラムに渡す必要があります。getopts
不明なパラメータを保存するのと似たようなことがありますか?
program
たとえば、私のスクリプトが呼び出され、引数を受け入れる必要があるとします。
-n
1つのパラメータとして、--verbose
議論の余地がなく、-s
議論の余地はありません。
すべてのオプションとその引数を解析して印刷し、残りのecho rest:
項目を呼び出します。次の出力を観察する必要があります。
> program -sin42 --long --verbose
-s
-n with argument 42
--verbose
rest: -i --long
> program -n --short
-n with argument --short
> program -n
error: -n without argument
シェルスクリプトでこのようなことを行うことはできますか?
ベストアンサー1
シェルで広く使用されていることはもちろん、これを行う標準的な方法もないと思います(つまり、最初から実装することが不足しています)。
非常に強力な組み込み機能をksh
サポートしていますが。getopts
これ(およびやや要求の厳しい要件)に基づいて、ksh
次のコードスニペットを使用して可能な基本的なソリューションの概要を説明しました。
while getopts ":[-][[n]:][99:verbose][s]" opt
do case $opt in
(n) n_arg=$OPTARG ;;
(99) verbose=1 ;;
(s) s=1 ;;
(*) arg_rest+=( "${@:OPTIND-1:1}" ) ;;
esac
done
shift OPTIND-1
printf "main opt(%s)=%s\n" "-n" "$n_arg"
printf "main opt(%s)=%s\n" "--verbose" "$verbose"
printf "main opt(%s)=%s\n" "-s" "$s"
function delegate
{
while getopts ":[-][i][98:long]" opt
do case $opt in
(i) int=1 ;;
(98) long=1 ;;
esac
done
shift OPTIND-1
printf "func opt(%s)=%s\n" "-i" "$int"
printf "func opt(%s)=%s\n" "--long" "$long"
}
printf "Delegate: '%s'\n" "${arg_rest[@]}"
delegate "${arg_rest[@]}"
プログラムは最初にすべてのオプションを解析し、必要に応じて内部変数を設定してから、不明なオプションを配列に保存します。これによりprintf
、設定を制御するためのいくつかのオプションが表示されます。その後、残りのオプションが委任される関数定義が提供され、その関数はコマンドに置き換えることもできます。最後に、残りのパラメータを使用して関数(または他のコマンド)を呼び出します。
ksh
(関数の説明はセッションgetopts
で呼び出されます。)ksh
getopts --man
このプログラムを実行すると、次のような出力が生成されます。
$ ksh ./getopts_script -s -n 23 --verbose -i --long
main opt(-n)=23
main opt(--verbose)=1
main opt(-s)=1
Delegate: '-i'
Delegate: '--long'
func opt(-i)=1
func opt(--long)=1
長いオプションをサポートするgetopts関数のシェル実装については、以下を参照してください。https://github.com/stephane-chazelas/misc-scripts/blob/master/getopts_long.sh