#!/bin/bash
readonly x=2
function test {
local x=1
echo ${x}
}
test
echo $x
明らかにする、
readonly-local-test.sh: line 6: local: x: readonly variable
2
2
これは変数が読み取り専用の場合に発生します。しかし、以下のように読み取り専用制限を削除すると、
#!/bin/bash
x=2
function test {
local x=1
echo ${x}
}
test
echo $x
明らかにする、
1
2
読み取り専用グローバル変数を非表示にできないのはなぜですか?
ベストアンサー1
Bashはシャドウができないようです。グローバル読み取り専用変数です。しかし、私はこれがPosixの追加だと思います$@
。地元の読み取り専用変数は非表示にできます。 Posixにはローカル変数がないため、すべての動作はposixの一貫性を維持します。
readonly
常にグローバル変数を定義します。ローカルの読み取り専用変数は、local -r
関数内で使用または定義できますdeclare -r
(local
関数内のように動作します)。
すべてのグローバル変数をローカル変数*に変換するようにスクリプトを変更できます。たとえば、すべてを内部に梱包main() { YOUR_SCRIPT_HERE; }; main
し、すべてreadonly
次に置き換えますlocal -r
。
#! /usr/bin/env bash
main() {
local -r x=constant
declare -p x
f() {
local x=mutable1
declare -p x
x=mutable2
declare -p x
}
f
declare -p x
# x=... would not work here
}
main
もちろん、無邪気な修正よりも「やるみんなmain
"内部スクリプトより良い構造のために外部で関数を定義することもできますmain
。
#! /usr/bin/env bash
main() {
local -r x=constant
declare -p x
f
declare -p x
# x=... would not work here
}
f() {
local x=mutable1
declare -p x
x=mutable2
declare -p x
}
main
*両方のバージョンで(以前はグローバル変数でした)main
が呼び出されたときに内部スコープにあることに注意してください。x
したがって、内部ローカル変数はほとんど実際のグローバル変数のように動作します。あなたが好きなら。f
main
main
C
例:
g() { local x=1; h; echo "g.x = $x"; }
h() { x=2; }
g
echo "global.x = $x";
…印刷中
g.x = 2
global.x =