講習会「シェルスクリプト入門」を開催しました

「シェルスクリプト入門」というタイトルで社内勉強会を開催しました。社内でアンケートを取ってみたところ、シェルスクリプトに苦手意識を持っている人がいるようです。「いやいや、普段のコマンドラインと大差ないよ」ということを伝えたくて、簡単な講習をしてみました。これで苦手意識が無くなってくれればいいんですが。

まとめ

  • if文がわかればシェルスクリプトは完璧(?)
    • 条件式の評価には[コマンド(又はtestコマンド)
    • 変数展開はクオーティングに注意
      • 比較するときは"x$hogehoge"を使えば万全
    • exit codeで他のコマンドと連携
      • 0は正常終了、1〜255は異常終了

ムービー

発表資料

補足など

時間的制約から盛り込めなかった内容について少し書いてみました。

&&と||

時間的制約もあり発表内容からは削ってしまいましたが、実際のシェルスクリプトではif文の代わりに&&と||が使われることがあります。

if [ -z $1 ] ; then
  echo empty string
fi

上記の内容は、&&を使って次のように書くことができます。

[ -z $1 ] && echo empty string

&&というのは、「 コマンド1 && コマンド2 」のようにコマンドとコマンドを並べて書く記法で、コマンド1が正常終了した場合のみコマンド2を実行する、という動作をします。testコマンドの-aとは使いどころが異なるので注意してください。(&&はコマンドを区切ってしまいます)

よくある利用例としては、「./confiure && make && make install」などの使い方でしょう。セミコロンで区切った場合と異なり、途中のコマンドが失敗すれば以降のコマンドは実行されません。依存関係があるコマンドの場合、以降のコマンドを実行しても無駄ですから、うまい使い方だと言えます。

他の制御構造

if文の他にswitch文というのがありますが、これは他の言語とよく似ているので見ればわかるでしょう。

また、for文は普段のコマンドラインでも大活躍です。「for [変数名] in [任意個の引数] ; do [コマンド] ; done」で、引数を1つづつ変数に代入し、引数の個数分だけループしてコマンドを実行します。これは特にワイルドカードやfindコマンドとの組み合わせで威力を発揮します。例えば、下記のように使えば全てのテキストファイルをUTF-8に変更できます。

for f in *.txt ; do nkf -w $f > $f.utf8; mv $f.utf8 $f; done

他には、while文を使ってループを作ることもできます。「while [条件文] ; do [コマンド] ; done」で、条件がfalse(0以外)になるまでループします。trueという、毎回exit code 0を返すコマンドと組み合わせると、コマンドラインでも簡単に無限ループが作れます。例えば下記のようにすれば5秒おきにhogeと言わせることができます。

while true ; do echo hoge ; sleep 5 ; done

もちろん、無限ループといってもCtrl+cで停止できますのでご安心を。

なぜ”x$hogehoge”と書く必要があるのか(12/02追記)

OSに付属するようなシェルスクリプトを読んでいると、”x$hogehoge”のように書かれているのを見ることがあります。”$hogehoge”のようにダブルクォートで囲むだけで十分そうなのに、なぜ余計なxが付いてるのか疑問に思いますよね。私も昔はそう思っていましたが、これには理由があります。

Advanced Bash-Scripting Guide7.3. Other Comparison OperatorsのNotesにも書いてあるのですが、評価式によってはダブルクォートで囲むだけでは不十分な場合があります。他にも、変数値が”-n”や”=”だった場合に[コマンドが理解できないケースがあります。ダブルクォートで囲むだけで十分な場合も多いのですが、熟練のシェルスクリプトプログラマーは事故防止のためにxを付ける習慣があるのだと私は理解しています。

もちろん、このxはどんな文字でも構いません。作者のフルネームを両辺に書いても問題は無いのですが、どうやら習慣的にxを使うことが多いようです。というか、x以外を使っている例を私は知りません。

コメント / トラックバック 2 件

#1 links for 2008-12-02 « 個人的な雑記 2008/12/03 07:05

[...] 講習会「シェルスクリプト入門」を開催しました (tags: programming shell) [...]

#2 2009/01/15に気になったこと | debeso 2009/01/15 23:56

[...] 講習会「シェルスクリプト入門」を開催しました シェルスクリプト勉強会 [...]

コメントする