MPのご利用は計画的に

だいたい自分用のメモ

Bashでは'readonly'より'local -r'を使っていきたい

概要

Bashスクリプトを書いている時に、関数内に閉じた形で読み取り専用の変数を宣言できないか調べたメモです。

環境

$ bash --version
GNU bash, バージョン 4.4.23(1)-release (x86_64-apple-darwin17.5.0)

readonlyはグローバル

変数を読み取り専用として宣言できるreadonlyですが 宣言した変数自体はグローバル変数です。

#!/bin/bash

set -eu

function setHoge() {
    readonly hoge="This is hoge"
}

setHoge
printf "hoge = ${hoge}\n"

exit 0
$ ./readonly.bash
hoge = This is hoge

変数hogeは関数の中で宣言していますが、関数の外からも参照できています。

localはスコープ内に閉じられる

localを使えば変数を関数などのスコープ内に閉じられます。

#!/bin/bash

set -eu

function setHoge() {
    local hoge="This is hoge"
    printf "hoge = ${hoge}\n"
    hoge="This is hogehoge"
    printf "hoge = ${hoge}\n"
}

setHoge
printf "hoge = ${hoge}\n"

exit 0
$ ./local.bash
hoge = This is hoge
hoge = This is hogehoge
./local.bash: line 13: hoge: unbound variable

ただし、そのままでは書き換え可能です。

rオプションをつければ安心

localで変数を宣言する際に-rをつけると読み取り専用にできます。

#!/bin/bash

set -eu

function setHoge() {
    local -r hoge="This is hoge"
    printf "hoge = ${hoge}\n"
    hoge="This is hogehoge"
    printf "hoge = ${hoge}\n"
}

setHoge
printf "hoge = ${hoge}\n"

exit 0
$ ./local-r.bash
hoge = This is hoge
./local-r.bash: line 8: hoge: readonly variable

これで安心です。

参考

stackoverflow.com