bashの定数・ローカル変数宣言

つい先日知った機能。これには驚いた。こんな初歩的なことも知らなかったのはなぜだろう。

単純におれが低脳だからというのもあるだろうが、もう少し考えてみる。基本的におれの学習方法はネット上のいろんなコードをパクりつつ覚えていくというものだから、オリジナルのコードを書いた人達も知らなかったことになる。

もしかして、あまり知られていない機能なのだろうか。それともスクリプトごときに長ったらしい修飾子なんざわざわざつけたがらないとか?

グローバル定数

変数宣言の際に readonly をつける。

#!/bin/bash

readonly hoge="HOGE"

function fun() {
    readonly fuga="FUGA"
    echo ${hoge}
    echo ${fuga}
}

fun
echo ${fuga}
hoge="PIYO"

実行結果:

HOGE
FUGA
FUGA
./sample.sh: line 13: hoge: readonly variable

ローカル変数

変数宣言の際に local をつける。

#!/bin/bash

readonly hoge="this is constant global hoge"
fuga="this is global fuga"

function fun() {
    local hoge="this is local hoge"
    echo ${hoge}
    local fuga="this is local fuga"
    echo ${fuga}
}

echo ${hoge}
fun
echo ${fuga}

実行結果:

this is constant global hoge
./sample.sh: line 7: local: hoge: readonly variable
this is constant global hoge
this is local fuga
this is global fuga

ローカル定数

変数宣言の際に local -r をつける。

#!/bin/bash

hoge="this is global hoge"

function fun() {
    local -r hoge="this is constant local hoge"
    echo ${hoge}
    hoge="this is fuga"
    echo ${hoge}
}

echo ${hoge}
fun
hoge="this is hoge called after fun"
echo ${hoge}

実行結果:

this is global hoge
this is constant local hoge
./sample.sh: line 8: hoge: readonly variable
this is hoge called after fun

まとめ

シェルとはいえ可読性上がるので、定数宣言はバンバン使おう。