「入門UNIXシェルプログラミング」を買いました

最近ちょっと気味が悪いくらいすんなり帰宅できてしまっているbonlifeです。(これはオカシイ…。そろそろヘヴィーな仕事が突然降ってくる予感…。)UNIX使ってるのにシェルもまともに書けないのは恥ずかしいなぁ…と思っていたところ、青木日記でこの本がオススメされていたので、勢いで買ってしまいました。読みたい(勉強したい)本が多過ぎて時間が足りません。(時間があっても読まなかったりするのですが…。)

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

まだ第1章しか読んでませんが、それでもなんだか良い感じです。第13章まであるので、1日1章ずつ会社で勉強してみます。だいたい3週間ぐらいで読み終わるかな。読み終わったら、getoptsなんかを駆使して既存のシェルの拡張とかもしていきたいところです。
そういや、最近シェルスクリプトを書いていてつまづいたことがあったのでメモメモ。

#! /bin/bash

# 変数 $hoge は空文字列

hoge=""

if [ -z $hoge ]; then
    echo '$hoge は空ですよ。'
else
    echo '$hoge は空じゃないですよ。'
fi

出力結果は以下の通り。

$hoge は空ですよ。

なんてことはないシェルスクリプトですよね。変数hogeに空文字列を代入して、それがゼロバイト長かどうかを判定するだけ。ところが、Bourne Shellでは全く同じ内容が正しく動かないのです!

#! /bin/sh

# 変数 $hoge は空文字列

hoge=""

if [ -z $hoge ]; then
    echo '$hoge は空ですよ。'
else
    echo '$hoge は空じゃないですよ。'
fi

出力結果は以下の通り。

./sample_b.sh[7]: test: 0403-004 このコマンドにはパラメータを指定してください。

あれー、なんだかエラーになっちゃいます。ガビョーン…。とういのも、変数hogeは空文字列としているつもりですが、実際にはヌルとして扱われているみたいなのです。このあたりは上で紹介した本の第2章の内容っぽいので、明日勉強します。とりあえず、変数を呼び出す時にダブルクォーテーションで括ってあげることで、文字列として扱うことができるようなので、修正して試してみました。

#! /bin/sh

# 変数 $hoge は空文字列

hoge=""

if [ -z "$hoge" ]; then
    echo '$hoge は空ですよ。'
else
    echo '$hoge は空じゃないですよ。'
fi

出力結果は以下の通り。

$hoge は空ですよ。

問題なしですね。cshでも試してみたのですが、やはりダブルクォートで括っておかないとエラーになりました。変数を文字列として扱わせるためにはダブルクォート、という基本的なルールを今頃知ったbonlife、UNIXに触れて5年目(恥)。一歩ずつ着実に成長していきたいところです。細々と頑張ります。