Bashのshell scriptで引数処理をするときにdocoptsが便利すぎた件

June 5, 2019, 7:41 a.m. edited June 7, 2019, 12:32 a.m.

#docopt  #Bash 

皆さん,Bashでシェルスクリプトを書くとき,引数処理をどのようにしていますか?

  • getopts
  • getopt
  • 自前で実装

この辺ですかね.検索してもだいたいこんな感じでした1

2019年,令和の時代にもなって自前で実装という選択肢が出てくるのは辛すぎませんか???

それではこちらをご覧ください↓

#!/bin/bash

eval "$(docopts -V - -h - : "$@" <<EOF
Usage:
  ./hoge.sh
  ./hoge.sh <foo> [--bar=<bar>]
  ./hoge.sh --help
  ./hoge.sh --version

Options:
  -h, --help             Show this screen.
  --version              Show version.
  -b <bar>, --bar=<bar>  Set bar option [default: 5].
----
v1.0.0
Copyright (C) your name
There is NO WARRANTY.
EOF
)"

if [ -z "${foo}" ]; then
    printf "No argument is detected.\n"
else
    printf "foo is ${foo}, bar is ${bar}.\n"
fi

2

実行結果

$ ./hoge.sh --help
Usage:
  ./hoge.sh
  ./hoge.sh <foo> [--bar=<bar>]
  ./hoge.sh --help
  ./hoge.sh --version

Options:
  -h, --help             Show this screen.
  --version              Show version.
  -b <bar>, --bar=<bar>  Set bar option [default: 5].
$ ./hoge.sh --version
v1.0.0
Copyright (C) your name
There is NO WARRANTY.
$ ./hoge.sh
No argument is detected.
$ ./hoge.sh 20
foo is 20, bar is 5.
$ ./hoge.sh 20 -b 10
foo is 20, bar is 10.

あ...ありのまま 今 起こった事を話すぜ!

「おれは hoge.shの使い方を書いていたと思ったら いつのまにか引数処理を終えていた」

な… 何を言っているのか わからねーと思うが

おれも 何をされたのか わからなかった

頭がどうにかなりそうだった… 文芸的プログラミングだとかコメントだとか

そんなチャチ(前者に関してはチャチではないし、後者も大切だよ)なもんじゃあ 断じてねえ

もっと恐ろしいものの片鱗を 味わったぜ…

_人人人人人人人人_
> 圧倒的手軽さ <
 ̄Y^Y^Y^Y^Y^Y^Y ̄

これはdocoptsによって実現されています3.そうです,あのPythonを筆頭に各言語で圧倒的に手軽な引数処理を実現するdocoptプロジェクトの1つです.

インストール方法は

$ pip install docopts

だけです4.圧倒的手軽(ry

使い方としては,上に挙げた例のように規格に則った説明文を書いてdocoptsに渡すだけです.そうすれば,${foo}${bar}といった変数に値が入ります.

配列だとかもっと詳しい使い方については,公式ホームページを参照してください.

それでは,良い引数処理ライフを!!


  1. 英語でも似たような感じ 

  2. ./hoge.sh${0}とするともっと良い感じ 

  3. sはshellのsかなぁ(他の言語に倣うとdocopt.bashになりそうなものだけれど) 

  4. pip install docoptだと,Python版(本家)のdocoptのみが入る.もちろんこっちも超絶便利