グローバル読み取り専用変数と同じ名前のローカル変数を持つことはできません。

グローバル読み取り専用変数と同じ名前のローカル変数を持つことはできません。
#!/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 -rlocal関数内のように動作します)。

すべてのグローバル変数をローカル変数*に変換するようにスクリプトを変更できます。たとえば、すべてを内部に梱包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したがって、内部ローカル変数はほとんど実際のグローバル変数のように動作します。あなたが好きなら。fmainmainC例:

g() { local x=1; h; echo "g.x = $x"; }
h() { x=2; }
g
echo "global.x = $x";

…印刷中

g.x = 2
global.x =

おすすめ記事