getopts でロングオプションを取る

getoptsではロングオプションは使えないということになっているが・・・

while getopts "\-:" opt
do
  case $opt in
    -) # long options
      case $OPTARG in
        help)
          print_help;;
        *)
          echo "unknown option: $OPTARG";
          exit 1;;
      esac;;

    ?)
      if [[ $opt = "?" ]]; then
        uopt=$OPTARG
      else
        uopt=$opt
      fi
      echo "unknown option: $uopt";
      exit 1;;
  esac
done

shift $((OPTIND - 1))

これでどうだ!
ロングオプションで更に値付きまでは検証してないが、OPTIND使うとか、あるいはオプション処理する毎に shift しといて $1 とるとかでなんとかなるか?

ちなみに、?) のとこが複雑な書き方になっているのは、getopts "・・・"のとこに書いてあるのにcase分で拾っていないオプションを与えた場合と、そもそもgetoptsの引数にあげていないオプションを与えた場合で挙動が違うから。