原則的にシェルスクリプトに変数のスコープはない。
ashや bash, zsh なんかだと内部コマンド local が、使えるので
local x=3 なんてやると、ローカル変数が利用できる。
が、ポータビリティが落ちる。
local を使いたくない場合は、サブシェルを使うことでグローバル変数 を壊さずに変数操作が出来る。
fact() {
local n
if [ "$1" -le 1 ]; then
echo 1
else
n=`expr $1 - 1`
expr `fact $n` \* $1
fi
}
fact 5
のように単にローカル変数だけ使って、グローバル変数操作を行なわないよ うな関数であれば local を使わずに書き直せる。
fact() {
(
if [ "$1" -le 1 ]; then
echo 1
else
n=`expr $1 - 1`
expr `fact $n` \* $1
fi
)
}
fact 5
定義本体をサブシェルを表す ( ) で括ってしまえばよい。 この結果をグローバル変数に取り込みたいときは、バッククォートで
answer=`fact 5`
のように取り込めばよい。さらに、 サブシェル内で関数定義すると、当然それも関数内ローカルとなる。 なかなか便利。