2012年2月21日火曜日

getoptsとシェルの選択


シェルついでにgetopsの話。getoptsを使うと、こんな感じでオプションのパーサを楽に書ける。
opt_a=
opt_b=
opt_c=
opt_d=
while getopts ‘abc:d:’ opt; do
  case $opt in
    a|b)
      eval “opt_$opt=1”;;
    c|d)
      eval “opt_$opt=’$OPTARG’”;;
  esac
done
shift `expr $OPTIND - 1`
上の例だと-aと-bが引数なし、-cと-dが引数ありのオプション。-abc ARGのように、複数のオプションをまとめて指定しても、きちんと解釈してくれる。引数ありのオプションは、-d ARGでも-dARGでもOK。
そんな便利なgetoptsの最大の弱点は、標準で備わっている保証がないこと。ただbashならgetoptsはbuilt-in化されているので、多少の可搬性を犠牲にしてでもgetoptsを使いたいときはshebangで
#!/bin/bash
と明示している。
ashでもbuilt-in化できることはできるが、ビルド時に無効にもできるので、ashならgetoptsが使えるという保証はできない。PCならともかく、組み込みだと切られているケースもあるかも。

0 件のコメント:

コメントを投稿