Bashはローカル変数をどのように初期化しますか?次のコマンドalwaysは同じことをしますか(関数内で使用した場合)?
local foo
local foo=
local foo=""
local foo=""
およびlocal foo=
はまったく同じです。どちらの場合も、等号の右側は空の文字列です。
local foo
およびlocal foo=
異なっています: local foo
はfoo
を未設定のままにしますlocal foo=
foo
を空の文字列に設定します。より正確に、 local foo
はローカル変数を作成し、その変数は最初は設定されていません。後続の割り当てfoo=…
はローカル値を設定し、その割り当てはlocal
ステートメントと組み合わせることができます。証人:
bash-4.3$ demo () {
local unset empty=
echo "unset=\"${unset-(not set)}\" empty=\"${empty-(not set)}\""
}
bash-4.3$ demo
unset="(not set)" empty=""
これはkshと同じ動作です(ただし、kshではtypeset
ではなくキーワードlocal
を使用する必要があります)。一方、zshではlocal foo
はfoo
を空の文字列に設定します。