【Shell】グローバル変数とローカル変数の有効範囲を確認

■グローバル変数

shell内の変数について、特に指定しない場合は、そのshell全体で有効なグローバル変数となる。
グローバル変数は、関数内外にかかわらず、変更・参照することができる。

▼作成する処理概要

グローバル変数の確認として、関数外で動物の名前をセットし、関数内部で動物の名前を変更する処理を実装する。

・フローチャート

・プログラム仕様

▼メイン処理

入力処理概要出力
動物の名前(犬)をセットする。:グローバル変数
動物の名前を出力する。初期値:動物名
動物の名前変更関数を呼び出す。
動物の名前を出力する。変更後:動物名

▼動物の名前変更関数

入力処理概要出力
区切りを出力する。区切り文字(#)
動物の名前を出力する。関数内の変更前:動物名
グローバル変数(動物の名前)動物の名前を猫に変更する。
動物の名前を出力する。関数内の変更後:動物名
区切りを出力する。区切り文字(#)

・サンプルコード

#!/bin/bash

# 動物の名前変更関数
update_animals_v1()
{
    echo "##########################"
    echo "関数内の変更前:"$animal_name
    # 動物の名前を変更(猫)
    animal_name=cat
    echo "関数内の変更後:"$animal_name
    echo "##########################"
}

# 動物の名前をセット(犬):グローバル変数
animal_name=dog
echo "初期値:"$animal_name
update_animals_v1
echo "変更後:"$animal_name

・実行結果

初期値:dog
##########################
関数内の変更前:dog
関数内の変更後:cat
##########################
変更後:cat

関数内で変更した値(cat)が関数外でも反映している。

■ローカル変数

一般的に、グローバル変数は適応範囲が広すぎるため、誤作動(バグ)が生じる可能性が高い。
これを避けるために、ローカル変数を使用する。

ローカル変数とは、変数の適応範囲を関数内に限定した変数である。

ローカル変数を定義する場合は、変数宣言または変数に値を設定するとき、先頭に「 local 」をつける

# 変数宣言
local animal_name

# アタイを設定する
local animal_name=cat

▼作成する処理概要

ローカル変数の確認として、上記「■グローバル変数」と同様に、関数外で動物の名前をセットし、関数内部で動物の名前を変更する処理を実装する。
ただし、関数内の変数はローカル変数とする。

・フローチャート

・プログラム仕様

▼メイン処理

入力処理概要出力
動物の名前(犬)をセットする。:グローバル変数
動物の名前を出力する。初期値:動物名
動物の名前変更関数を呼び出す。
動物の名前を出力する。変更後:動物名

▼動物の名前変更関数

入力処理概要出力
区切りを出力する。区切り文字(#)
動物の名前を出力する。関数内の変更前:動物名
動物の名前を猫に変更する。:ローカル変数
動物の名前を出力する。関数内の変更後:動物名
区切りを出力する。区切り文字(#)

・サンプルコード

#!/bin/bash

# 動物の名前変更関数
update_animals_v2()
{
    echo "##########################"
    echo "関数内の変更前:"$animal_name
    # 動物の名前を変更(猫):ローカル変数
    local animal_name=cat
    echo "関数内の変更後:"$animal_name
    echo "##########################"
}

# 動物の名前をセット(犬)
animal_name=dog
echo "初期値:"$animal_name
update_animals_v2
echo "変更後:"$animal_name

・実行結果

初期値:dog
##########################
関数内の変更前:dog
関数内の変更後:cat
##########################
変更後:dog

関数内で変更した値(cat)が関数外でも反映せず、関数外では、初期値で設定した値(dog)のままである。

コメント

  1. […] グローバル変数とローカル変数の有効範囲を確認 | え〜のう […]

タイトルとURLをコピーしました