原則的にシェルスクリプトに変数のスコープはない。
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`
のように取り込めばよい。さらに、 サブシェル内で関数定義すると、当然それも関数内ローカルとなる。 なかなか便利。