「-」で始まらないパラメータに達するまで、「-」で始まるすべてのパラメータを削除する必要があるbash関数があるとします。
gmx(){
local options=( );
while [ "${1:0:1}" == "-" ]; do
options+=("${1}")
shift 1;
done
echo "first legit arg: $1"
"$@" # omg will be executed here, like `omg --rolo`
}
gmx -a -f -c omg --rolo
これはうまくいくようですが、これが常に「omg」を最初の「法的」パラメータとして置くための良い一般的な解決策であると思います。失敗する可能性がある極端なケースはありますか?
つまり、-a、-f、-cはすべてgmxのパラメータです。そしてomg
それに続くすべては子プロセスで実行されます。
ベストアンサー1
正式で最善の方法は、getopts
組み込み関数を使用してコマンドラインオプションを解析しないことです。
詳しくはマニュアルページをご覧ください。
注意事項が重要な場合があります。bash
長いオプションはサポートされていません。
長いオプションを処理するためにスクリプトを好む場合は、それksh93
をサポートする2つのシェルがあります。bosh
両方のシェルは、getopt(3)
Solarisのlibc関数が長いオプションをサポートしているかのように長いオプションをサポートします。 boshのマニュアルページ(現在の43ページから始まる)を参照してください。
http://schilytools.sourceforge.net/man/man1/bosh.1.html
getopts "f:(file)(input-file)o:(output-file)" OPT
-f
たとえば、引数を使用し、そのオプションに長いオプションの別名と、そのオプションの--file
2番目の別名を持つオプションをサポートします。--input-file
ksh93もこれをサポートしますが、ksh93のマニュアルページには文書化されていません。