• このエントリーをはてなブックマークに追加

【シェルスクリプト入門】その3: 変数の使い方

  • このエントリーをはてなブックマークに追加

shell
zaco muraです。

前回の記事【シェルスクリプト入門】その2: デバッグの方法ではシェルスクリプトがうまく動かない時の対処方法を書きました。

そこでも少し触れていましたが、今回はプログラミングに欠かせない概念である変数について説明したいと思います。

スポンサーリンク
Sponsords Link

変数とは

まずはwikipediaさんに定義を聞いてみますと

変数とは
プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。

ということが書いてありますが、端的に言うと


変数 = データを一時的に格納するための箱

というように理解すればよいかと思います。

変数の使い所

変数を使う場面は主に2つあると考えられます。

1つ目は、データに対して複数の処理を行うために中間データを保持したい場合。
2つ目は、固有パラメータを変数化し可読性・保守性を向上させたい場合。

この2点についてそれぞれ説明していきます

1.中間データを保持する場合

例えば、以下のようなスクリプトがあるとします。

#!/bin/bash
#########################
# googleDNSにpingを打ってインターネット疎通を確認
#########################
ping -c 1 8.8.8.8 | grep " 0% packet loss" > /tmp/result.txt
if [ -s /tmp/result.txt ];then
    echo "ping success"
else
    echo "ping failed"
fi

要するにpingの実行結果をもって疎通を確認したいわけです。
そこで、一時的に”/tmp/result.txt”というファイルにpingの実行結果を保存し、その後のif文で判断するというわけです。

もちろんこれでも動きますが、個人的な経験としてファイルに一時保存するやり方は問題が起こりやすいです。

理由は何らかの理由でファイルが作れない場合や、別処理・別スクリプトと競合する場合があるためです。
大規模なスクリプトになればなるほどこの問題は起きやすく、そして発見が難しいです。

このため、実行結果をファイルでなく変数に保存するようにします。

#!/bin/bash
#########################
# googleDNSにpingを打ってインターネット疎通を確認
# (変数版)
#########################
RESULT=`ping -c 1 8.8.8.8 | grep " 0% packet loss" `
if [ -n "${RESULT}" ];then
    echo "ping success"
else
    echo "ping failed"
fi

pingを実行する部分が変わりました。このスクリプトではpingの実行結果が変数RESULTに格納されます。
ちなみに pingを実行している部分の`コマンド` というのはコマンドの中で別コマンドを実行する書式です。(この場合はRESULT=…という変数宣言というコマンドの中で、`ping -c 1 …`という別コマンドを実行)

また結果を判定するif文も少し変わっています。変数は参照する時に${変数名}と書きます。(実際には$変数名でも動きますが、わかりやすいので${}と書くクセを付けると良いかと思います。)

変数というのは基本的にファイル内に閉じたものなので、別スクリプトへの競合はありませんので、誤動作のリスクを減らすことができます。

2.固有パラメータを変数化する場合

これは1に比べてシンプルな理由です。IPアドレスやファイル名など、運用の過程で変更になる(可能性が高い)パラメータを変数化することで、修正箇所を減らすということです。

#!/bin/bash
ping -c 1 8.8.8.8 > /tmp/result.txt

cat /tmp/result.txt | mail -s "ping_result" mail@mail_address.co.jp

rm /tmp/result.txt

例えば上の例では”/tmp/result.txt”というファイル名が3回出てきます。もちろん全部変えれば良いのですが、それよりも以下のようにしたほうがスマートです。

#!/bin/bash
RESULT_FILE="/tmp/result.txt"
ping -c 1 8.8.8.8 > ${RESULT_FILE}

cat ${RESULT_FILE} | mail -s "ping_result" mail@mail_address.co.jp

rm ${RESULT_FILE}

こうすることで、もしファイル名が変わった場合でも一番上の行を変えるだけで修正が完了します。

また例えばIPアドレスであれば、他人が見た時に「このアドレスって何のアドレス?どのサーバ?」というのがわかりづらいですが、変数名に”FTP_SERVER_ADDRESS”とか付けておけば可読性も高まりますね。

まとめ

ということで、今回はシェルスクリプトの重要な要素である変数について書きました。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link