UNIX/Linuxの部屋 localコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド local sh・bash において、変数を関数内ローカル変数として宣言するための内部コマンド このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux の local コマンドは、bash と一部の sh において、変数を関数内のローカル変数として定義・宣言するためのシェルの内部コマンドである。シェルスクリプトなどで、関数内にローカル変数を定義したり宣言したりする際によく使用される。



local コマンドの基本的な使い方
local コマンドは、シェルスクリプト等の関数内で、下記のように変数に対して使用する。
myfunc() {
local var="2"
}
myfunc
echo $var
これにより、関数内部の var はローカル変数となり、外部からは変数 var を参照できなくなる (上記の最後の echo では、$var は未定義となる)。

local コマンドの解説
そもそも sh・bash において、下記のように設定した変数はグローバル変数として扱われる。
var="1"

より具体的に言うと、下記のように関数外で設定した変数を関数内で更新すると、関数を出た後もその変更した変数が有効になる。
myfunc() {
var="2"
echo "var(in myfunc): $var"
}
var="1"
myfunc
echo "var: $var"
# 上記、結果は 2 になる

一般的にはグローバル変数を多用することはよろしくなく、関数内のみで使う変数は関数内のローカル変数にすることが望ましい。bash と一部の sh コマンドでは、local コマンドを使うと変数をローカル変数にすることができる。

下記は、関数内で変数 var を local コマンドによりローカル変数として設定している。これにより関数内の var とグローバル変数の var は別物になるため、関数内での代入が関数の外に影響を与えないようになる。
myfunc() {
local var="2"
echo "var(in myfunc): $var"
}
var="1"
myfunc
echo "var: $var"
# 上記、結果は 1 になる (2 ではなく)

local コマンドの書き方
local コマンドにはいくつかの書き方がある。一つ目は、下記のように代入を同時に行う書き方である。
local var="1"

二つ目は、local でローカル変数化した後に代入を行う方法である。
local var
var="1"

どちらを選ぶかは通常は趣味の問題であるが、下記のように local と同時にコマンド結果を受け取り、終了ステータス "$?" をチェックする場合はうまく動作しない。
local result=`コマンド`
ret=$?
if [ $ret == 1 ]; then
エラー処理
fi
なぜならば、「コマンド」の終了ステータス $? を、local の終了ステータス $? で上書きしてしまうからである。このようなときは、下記のように local と代入を分ける書き方を使うとよい。
local result
result=`コマンド`
ret=$?

なお、local コマンドは下記のように複数の変数を一度に記述可能である。
local var1 var2
local var1=A var2=B

local コマンドは関数内でのみ使用可能
local コマンドは関数内でのみ使用可能である。つまり下記のとおりである。
# 関数外なので local は使えない

myfunc() {
# 関数内なので local が使える
}

# 関数外なので local は使えない

関数外で使用すると、下記のようにエラーとなる。
▷ Linux + Bash の場合
% local xx
bash: local: can only be used in a function
▷ FreeBSD の sh の場合
% local xx
local: Not in a function

local のスコープ
これまで「local は関数内のローカル変数」と説明してきたが、実際は少し違う。関数 A から関数 B を呼び出した場合、関数 A 内で local とした変数は、関数 B からでも参照・更新が可能となる。これをプログラミング言語の一般的な用語として、動的スコープ (ダイナミックスコープ) と呼ぶ。
myfunc_A() {
local var="2"
echo "var(in myfunc_A): $var"
myfunc_B
echo "var(in myfunc_A): $var"
}
myfunc_B() {
echo "var(in myfunc_B): $var"
}
var="1"
myfunc_A
echo "var: $var"

上記スクリプトの実行結果は下記のとおりで、myfunc_A 内で local var としたものが、myfunc_B から参照可能となっていることに注目してほしい。
var(in myfunc_A): 2
var(in myfunc_B): 2
var(in myfunc_A): 2
var: 1

なお、myfunc_B 内でも local var とすれば、myfunc_A 内の var と myfunc_B 内の var は別物となる。

local コマンドが使える sh・bash
local コマンドは POSIX で定義されたコマンドではないため、どの sh・bash でも使えるとは限らない。当ページ管理人が調べた限りでは、local を使えるのは下記。
  • すべての bash (UNIX/Linux を問わず)
  • FreeBSD の sh (ash)
  • NetbSD の sh (ash)
  • Debian・Ubuntu の sh (dash)

一方、使えないと思われるものは下記のシェルである。
  • SunOS/Solaris の sh・ksh
  • HP-UX の sh・ksh
  • OpenBSD の sh