シェル関数でローカル変数を使う

原則的にシェルスクリプトに変数のスコープはない。

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`

のように取り込めばよい。さらに、 サブシェル内で関数定義すると、当然それも関数内ローカルとなる。 なかなか便利。


Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]