web-dev-qa-db-ja.com

Bashローカル変数の初期化

Bashはローカル変数をどのように初期化しますか?次のコマンドalwaysは同じことをしますか(関数内で使用した場合)?

local foo
local foo=
local foo=""
3
Cyker

local foo=""およびlocal foo=はまったく同じです。どちらの場合も、等号の右側は空の文字列です。

local fooおよびlocal foo= 異なっています: local foofooを未設定のままにします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 foofooを空の文字列に設定します。