シェルスクリプト内で宣言した変数はどの領域にあってもグローバル変数として扱われます。
例え、whileループ中で宣言したものでもグローバル変数になるのでループを抜けても有効になります。
もちろん、関数が違っても変数はグローバルなのですべての関数間で有効になります。
そのため、関数通しで変数名が重ならないように気をつけなければなりません。ネームスペースをつけるのも良い方法だと思います。
もちろん変数をローカルで宣言することもできます。
local 変数名
という風にして変数を指定すればローカル変数として扱えます。
ただし、シェルスクリプトでのローカル変数はC言語などと違い、whileループやcase文の中ですら無効になるので、非常に利用領域の狭い扱いづらい変数になってしまいます。
シェルスクリプトをずっと書いていていた後にC言語でプログラムを書くと本当にC言語って便利だなぁというのが実感できます。