ぞうのお勉強日記

日々是勉強

カスタム検索


bashスクリプト入門 その6

bashスクリプト 入門編第6回目です。
前回作成したスクリプトの問題点を改善しましょう。
  1. 無料アクセス解析


前回、以下の様なスクリプトを作成しました。
#!/bin/bash
V_OPTION=$1

if test ${V_OPTION} = "bash"
then
    echo "Hello bash World!!"
elif test ${V_OPTION} = "Linux"
then
    echo "Hello Linux OS!!"
fi

要件は以下の2点
・第一引数が「bash」だったら「Hello bash World!!」と表示する。
・第一引数が「Linux」だったら「Hello Linux OS!!」と表示する。

確かに要件を満たしているので、前回のスクリプトでも正解と言えない事もありません。
ですが、このスクリプトには問題点がいくつかあります。

まずは1つ目の問題から

例外処理がされていない。

上記2つの要件を満たしているのですが、それ以外のパターンの事が一切考えられていません。
例えば、「bash」と「Linux」以外の引数だった場合、どのような動作をするでしょうか?
[root@xen01 ~]# ./helloworld3.sh bsd
[root@xen01 ~]# 
[root@xen01 ~]# ./helloworld3.sh linux
[root@xen01 ~]# 
[root@xen01 ~]# ./helloworld3.sh 
./helloworld3.sh: line 4: test: =: unary operator expected
./helloworld3.sh: line 7: test: =: unary operator expected
[root@xen01 ~]# 
引数に「bsd」や「linux」とつけてみました。何も表示されませんね。
引数を何もつけなかった場合はどうでしょう。何やらエラーが出力されています。
この様に、想定している事以外の処理を「例外処理」と言います。
今回のスクリプトの場合、「bsd」と「linux」が引数付与された場合の動作は想定通りとしても
最低限、引数が付与されなかった時、エラーが出力される事は避けるべきです。

2つ目の問題点
if文の動作が何やらおかしい

引数を何もつけずに動かした場合、以下の様なエラーが発生していました。
./helloworld3.sh: line 4: test: =: unary operator expected
./helloworld3.sh: line 7: test: =: unary operator expected

このエラーはなんでしょうか?
4行目と7行目がおかしい様ですが、パッと見ただけでは判りませんね。
こういう時は、詳細な処理ログを見れば判る時が多々あります。
bashスクリプトでは、詳細な処理ログを「-x」オプション付与によって出力してくれます。
スクリプト1行目の
#!/bin/bash

#!/bin/bash -x
に変更し、スクリプトを実行してみましょう。

まずは正常動作時のログから
[root@xen01 ~]# ./helloworld3.sh bash
+ V_OPTION=bash
+ test bash = bash
+ echo 'Hello bash World!!'
Hello bash World!!
[root@xen01 ~]# 

次は、オプションを何もつけなかった時のログ
[root@xen01 ~]# ./helloworld3.sh
+ V_OPTION=
+ test = bash
./helloworld3.sh: line 4: test: =: unary operator expected
+ test = Linux
./helloworld3.sh: line 7: test: =: unary operator expected
[root@xen01 ~]#

やはり判定文の所がおかしいですね。
4行目と7行目はどの様な判定文を書いていたでしょうか?
#!/bin/bash -x
V_OPTION=$1

if test ${V_OPTION} = "bash"
then
    echo "Hello bash World!!"
elif test ${V_OPTION} = "Linux"
then
    echo "Hello Linux OS!!"
fi

大体想像つきましたか?
本来、第一引数が格納されるはずの「V_OPTION」変数に何も格納されていないので、動作がおかしくなっているようです。
bashの変数は文字列と数字を格納する事ができますが、何も格納されていないこの状態の時、
変数内には「null」が格納されています。数字でも文字列でも無い、敢えて言うならば「何も無い」という状態です。
「何も無い」という状態と「bash」や「Linux」という文字列を比較した場合、比較対象が真か偽の判断がつかない為、エラーが出力されている事になります。

では、この2点の問題を修正しましょう。

1点目の問題点を修正する為には、「例外処理」を加えるだけで大丈夫です。
if文の例外処理はelse以後に記入します。

2点目の問題点の修正方法は「引数が文字列である」という事を明確にする事で大丈夫です。
「echo」文でやっている通り、文字列を出力する場合、文の最初と最期に「"」を付けて括っています。
変数の場合も、文字列を扱う場合、「"」で変数を括る事により、文字列だと言うことを明示的にする事ができます。
それでは、以下の様にスクリプトを修正し、実行してみましょう。
#!/bin/bash 
V_OPTION=$1

if test "${V_OPTION}" = "bash"
then
    echo "Hello bash World!!"
elif test "${V_OPTION}" = "Linux"
then
    echo "Hello Linux OS!!"
else
    echo "Hello World!!"
fi

[root@xen01 ~]# ./helloworld3.sh bash
Hello bash World!!
[root@xen01 ~]# ./helloworld3.sh Linux
Hello Linux OS!!
[root@xen01 ~]# ./helloworld3.sh bsd
Hello World!!
[root@xen01 ~]# ./helloworld3.sh linux
Hello World!!
[root@xen01 ~]# ./helloworld3.sh 
Hello World!!
[root@xen01 ~]# 

bash」と「Linux」以外の引数、もしくは引数が付かなかった時の動作として、「Hello World!!」と出力するようにしてみました。
文字列の判定文では変数を「"」で括るようにしました。

これでひとまず、バグ処理は終了です。

テーマ:Linux - ジャンル:コンピュータ

  1. 2008/10/12(日) 17:00:47|
  2. bashスクリプト入門
  3. | トラックバック:0
  4. | コメント:0
<<bashスクリプト入門 その7 | ホーム | bashスクリプト入門 その5>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://zow.blog43.fc2.com/tb.php/21-c078b6a4
この記事にトラックバックする(FC2ブログユーザー)