変数のデフォルトのスコープはスクリプト全体です。
ただし、関数内で変数を宣言すると、変数はそれを宣言する関数に対してローカルになります。Ksh には動的スコープがあるため、変数は、変数を宣言する関数によって呼び出される関数でもアクセスできます。これは、マニュアルの関数に関するセクションで簡潔に文書化されています。AT&T ksh では (pdksh と派生物、および bash と zsh の同様の機能とは対照的に)、これはfunction
キーワードで定義された関数にのみ適用され、従来のf () { … }
構文で定義された関数には適用されないことに注意してください。AT&T ksh93 では、従来の構文で定義された関数で宣言されたすべての変数はグローバルです。
変数を宣言する主な方法は、typeset
ビルトインを使用することです。常に変数をローカルにします (AT&T ksh では、 で宣言された関数のみfunction
)。で宣言せずに変数に割り当てると、typeset
グローバルになります。
set -A
ksh のドキュメントでは、変数をローカルにするかグローバルにするかは指定されておらず、バージョンが異なるといずれかになります。ksh 93u、pdksh、または mksh では、変数はグローバルであり、スクリプトは値を出力します。スコープがローカルである ksh88 または古いバージョンの ksh があるようです。関数の外で初期化するとグローバル変数が作成されると思いますstr
が、よくわかりません。
ローカル変数を使用して の値をオーバーライドする必要があることに注意してください。別の変数への保存は扱いにくいだけでなく、設定されていない場合は適切にIFS
復元されないため脆弱でもあります。IFS
さらに、グロビングをオフにする必要があります。そうしないと、文字列にシェルのグロビング文字が含まれていて?*\[
、その単語の 1 つがシステム上の 1 つまたは複数のファイルと一致する場合、それが展開されます。たとえばset -A $string
、where string
isa;*
はstr
ファイル名のリストを現在のディレクトリ。
set -A str
function splitString {
typeset IFS=';' globbing=1
case $- in *f*) globbing=;; esac
set -f
set -A str $string
if [ -n "$globbing" ]; then set +f; fi
}
splitString "$string"