unsetは何をしますか?

unsetに関する次の部分を理解しようとしています。 div> https://unix.stackexchange.com/a/381782/674

unset in bash 現在のスコープで宣言されている場合にのみ、変数の設定を解除しますグローバルスコープを除いて宣言されたままにします;属性と値を削除し、変数は配列またはハッシュではなくなります。 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 aaの設定を解除しませんでした。代わりに、それは下にあるもの、外側のスコープからのものを明らかにしました。 gが返されると、fa変数はローカルではなくなります。

bash 5+では、localvar_unsetオプションを設定することで修正できます。

mkshおよびyashここで、unsetは、設定を解除する代わりにポップします。 同じスコープで宣言されている変数の場合でも。それらを使用した最初の例は次のとおりです。

typeset a=0 2 

さらに読む:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です