オプションを解析するsellZshシェルスクリプトでコマンドライン引数をオプションとして解析したいときは、getoptsを使うのが一般的なやり方だ。getoptsはGNUスタイルの長いオプションに対応していないので、--helpとかのオプションを受け付けれないという欠点がある。そんなときでも、zshならzparseoptsというコマンドを使えば長いオプションでも解析できるので紹介する。基本パターンまずは一番簡単なパターンとして、次の3つのオプションを解析する例を紹介する(mvコマンドのオプションをイメージしている)。どのオプションも引数は取らない。-v--help--versionこのオプションをパースするには、zparseoptsというzshの組み込みコマンドを使って、次のように書く。vの部分で、どういう名前のオプションに対応しているのかを指定している。こんなふうに、オプション名の先頭の-を取り除いた名前を並べて指定する。opthashを指定している。-Dは、シェルスクリプト自体の元の引数のうち、オプションとしてみなした部分は取り除くという意味。デフォルトの動作としては、zparseoptsを呼び出した後でも$@(シェルスクリプト自体の引数)は変わらない。-Dを指定すれば、zparseoptsを呼び出した後はオプションとみなした部分が$@から取り除かれる。オプションでない通常の引数だけが$@に残るようになる。普通はこの方が便利なので、-Dは指定しておいたほうが良いと思う。opthashというのは、opthashという名前の連想配列にオプションとみなした引数を格納する、という意味になる。連想配列の中身は「キー=オプション名」「値=オプション引数(引数を取らない場合は空文字列)」になる。opthashという名前は別に何でも良い。オプションが指定されたかの判定は、その下のif文でやっている。これは、例えばひとつ目のif文の場合は「opthash連想配列に--helpというキーが含まれているか」ということを意味している。このようにzshで連想配列を扱う方法については、詳しくは次の記事を参照するとよい。Qiitaこのシェルスクリプトを実際に呼び出したときの例は次の通り。次はオプションが引数を取る場合の例として、さっきのオプションに加えて-Sオプションが引数を取る場合を紹介する。(何らかの文字列を引数に取る)このオプションをパースするには次のように書く。$@"最後のS:というところが今回追加した箇所。こんなふうにオプション名の後ろに:を付けると、そのオプションは引数を取る、という意味になる。オプション引数の値は連想配列の値として格納されるので、この例の場合は-Sオプションの引数は${opthash[-S]}で参照できる。これを呼び出したときの例は次の通り。to最後の例のように、引数を取る同じオプションを2回以上指定したときは後に指定したほうで上書きされる。最後に、同じ意味を表す別名のオプションがある場合について紹介する。今回のオプションの例は以下。SUFFIX--help--version-vと--verboseは、同じ意味の別名のオプションとする。このシェルスクリプトでは、-vと--verboseのどちらのオプションを指定しても同じ動作になるようにする。同様に、-Sと--suffixも同じ意味とする。-Sと--suffixはどちらも引数を取る。これをパースする書き方は以下(\で複数行に分割しているのには深い意味はない。行が長くなったので分割してるだけ)。$@"まず、zparseopts自体に-Mというオプションを追加している。すると、<オプションの別名>=<オプション名>という形でオプションの別名が指定できる。これは、<オプションの別名>で指定したオプションの値が<オプション名>と同じ名前で格納される、という意味になる。}という値が格納される。これを呼び出したときの例は次のとおり。変数名としてoptionsというのを使おうとしたんだけど、次のようなエラーが出てしまった。parameterどうやらzsh自身がoptionsという名前の変数を使っているようで、自分で作ったスクリプトでその名前の変数を使えないみたい。