次のunset
部分を理解しようとしています。https://unix.stackexchange.com/a/381782/674
unset
存在するbash
現在の範囲で宣言されている未設定の変数のみ(グローバル範囲を除いて宣言を維持します。;プロパティと値を削除し、変数は配列やハッシュではなくなりました。また、namerefsは参照された変数の設定を解除します。それ以外の場合は、上記のスタックから変数レイヤーをポップします。
Bashのマニュアルには、関連内容が記載されていないか、見逃されています。
たとえば、説明してもらえますか?
- 「現在の範囲で宣言されている未設定の変数のみ」
「これはグローバル例外にもかかわらず明示されています。」
unset
変数が関数のローカルスコープにある場合、変数は設定解除されるだけでなく宣言も解除されませんかunset
?unset
変数がグローバルスコープにある場合、unset
変数は設定解除されていますが、まだ宣言されていますか?変数が宣言されているかどうかを確認するには?
「そうしないと、上記のスタックから変数レイヤーが飛び出します。」
「そうでなければ」と「可変レイヤー」とはどういう意味ですか?
ありがとうございます。
答え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
まだa
ローカルで行われており、f
外部スコープのエントリは影響を受けませんでした。これはいいと私たちが望むものです。
存在する:
$ ./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+では、optionsを設定してこの問題を解決できますlocalvar_unset
。
どこが悪くなるのを見ましたかmksh
?yash
unset
飛び出す変える未設定これは、同じスコープで宣言された変数についても同様です。最初の例は次のとおりです。
typeset a=0
2
追加資料: