のunsetに関する次の部分を理解しようとしています。 div> https://unix.stackexchange.com/a/381782/674
unsetinbash現在のスコープで宣言されている場合にのみ、変数の設定を解除します( グローバルスコープを除いて宣言されたままにします;属性と値を削除し、変数は配列またはハッシュではなくなります。 namerefsでは、参照される変数の設定が解除されることに注意してください)。 それ以外の場合は、上記のスタックから1つの変数レイヤーをポップするだけです。
Bashのマニュアルには、関連する内容が記載されていないか、見逃しています。
例を挙げて説明していただけますか
- “変数の設定を解除するのは、次の場合のみです。現在のスコープで宣言されています “
-
“グローバルスコープを除いて宣言されたままです “。
unset関数のローカルスコープにある変数は、unset変数が設定されていないだけでなく、宣言されていませんか?グローバルスコープ内の変数、
unset変数は設定されていないが、まだ宣言されていますか?変数が宣言されているかどうか?
-
「それ以外の場合は、上記のスタックから1つの変数レイヤーをポップするだけです。」
「その他」と「1つの可変レイヤー」とはどういう意味ですか?
ありがとうございます。
回答
例を挙げてください:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
同じスコープで宣言された変数で呼び出されたunset。適切に設定されていません。それはまだ宣言されていますが(属性と値は失われていますが)、それでもその範囲に限定されています。 a=2を実行しても、f<のローカルのaで実行されていることがわかります。 / div>、外部スコープのものは影響を受けません。それは良いことであり、私たちが望んでいることです。
In:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
unset aはaの設定を解除しませんでした。代わりに、それは下にあるもの、外側のスコープからのものを明らかにしました。 gが返されると、fのa変数はローカルではなくなります。
bash 5+では、localvar_unsetオプションを設定することで修正できます。
mkshおよびyashここで、unsetは、設定を解除する代わりにポップします。 同じスコープで宣言されている変数の場合でも。それらを使用した最初の例は次のとおりです。
typeset a=0 2
さらに読む: