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
これで安心です。