望@田園調布

 今日は雨が降ったら赤坂のカフェ、晴れだったら自転車で田園調布のカフェと決めていたのですが、晴れたので田園調布にある「望」に行ってきました。近所なので、Pascalも道連れ。田園調布駅までは、自転車で約15分といったところで、田園調布自体には初めて行くのですが、緑と都会が調和した落ち着いた場所でした。
 
 今日はお祭りがあったようで、ちょっとにぎやかでしたが。
 
f:id:Kirika:20090608141528j:image
 途中で見つけたサンリオの店。リンゴの建物とは……w
 
 カフェは自体は、よくある普通のカフェで昼過ぎにカレーセット(950円)と5時過ぎにクリームソーダ(600円)を注文。5時間ぐらい篭ったのですが、椅子が固くてちょっと疲れましたw 次のカフェを巡るときは座布団を用意しよう……。
 
 ここも無線LAN OK、電源OKの店。周りはお祭りの休憩客の入れ替えが激しかったのですが、満員になるというわけでもなく、特に追い出されること無く快適に居られました。あー。でも蚊が多かったのは減点かな……。(今気づいたけど、カフェ自体の写真が無いじゃん……。)
 
 次回は赤坂のカフェを攻めようと思います。
 

シェルスクリプトを書くときに地味に便利なgetopt

 シェルスクリプトを書くとき、引数のチェック処理は地味にめんどくさいのですが、Linux上ではgetoptというコマンドが華麗に処理をしてくれるようです。ちなみにbash内にもgetoptsというビルトイン関数があるのですが、汎用性では若干getoptの方が上かな?といった感じです。
 
 使い方は、

 getopt -o shortoptstring -l longoptstring -- parameter

 
 shortoptstringは-aや-bなどパラメータが1文字の引数。-abという風に続けて書いた場合でも処理できます。書式は「abc」のように並べて書くだけ。特殊な記法として「:(コロン)」を使う書き方があります。「:」は1個だとパラメータに引数が必須となるもの。つまり「-a hoge」等パラメータを渡さないとパーサが失敗して、getoptが正常終了しません。また「::」と2つ繋げると、引数をとる場合もあるという意味になります。

 longoptstringは--hostname等長いパラメータを渡す引数。ちなみにオプションを変えれば「--」の部分を「-」と1文字に変えたり、「+」にすることも出来ます。shortoptstringと違いパラメータは「,(カンマ)」で区切ります。また、shortoptstringと同様に「:」を使った記法が可能です。

 今回は hostnameとusernameを引数として渡すシェルを書いたので、以下のように書きました。

#!/bin/bash

# check command args.
if [ $# -lt 1 ]; then
  echo >&2 "usage: $0 [-h|--hostname hostname] [-u|--hostuser username]"
  exit 1
fi

OPT=`getopt -o h:u: -l hostname:,hostuser: -- $*`
if [ $? != 0 ]; then
  echo >&2 "usage: $0 [-h|--hostname hostname] [-u|--hostuser username]"
  exit 1
fi
eval set -- $OPT
while [ -n "$1" ]; do
  case $1 in
    -h|--hostname) hostname=$2 ; shift 2;;
    -u|--hostuser) hostuser=$2 ; shift 2;;
    --) shift; break;;
    *) echo "Unknown option($1) used."; exit 1;;
  esac
done

 
 getoptのパースが成功するとリターンコードとして0が返ります。返らなければパースが失敗しているので、エラーメッセージを出して終了させます。
 成功すると、「--hostname foo --username bar --」のような文字列を出力するので、--が来るまでループをまわして、処理すれば、簡単に変数のチェックとパースを行うことが出来ます。
 
参考にしたサイト
 http://www.linux.or.jp/JM/html/util-linux/man1/getopt.1.html
 http://d.hatena.ne.jp/taiyo/20080211/