コマンド
local
sh・bash において、変数を関数内ローカル変数として宣言するための内部コマンド
最終更新 2019-01-05
UNIX/Linux の local コマンドは、bash と一部の sh において、変数を関数内のローカル変数として定義・宣言するためのシェルの内部コマンドである。シェルスクリプトなどで、関数内にローカル変数を定義したり宣言したりする際によく使用される。
● local コマンドの基本的な使い方
local コマンドは、シェルスクリプト等の関数内で、下記のように変数に対して使用する。
myfunc() {
local var="2"
}
myfunc
echo $var
これにより、関数内部の var はローカル変数となり、外部からは変数 var を参照できなくなる (上記の最後の echo では、$var は未定義となる)。
より具体的に言うと、下記のように関数外で設定した変数を関数内で更新すると、関数を出た後もその変更した変数が有効になる。
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 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