のunset
に関する次の部分を理解しようとしています。 div> https://unix.stackexchange.com/a/381782/674
unset
inbash
現在のスコープで宣言されている場合にのみ、変数の設定を解除します( グローバルスコープを除いて宣言されたままにします;属性と値を削除し、変数は配列またはハッシュではなくなります。 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
さらに読む: