[DOS]expansion
DOSの変数展開の話。
DOSの変数展開は、他の多くのシェルと同様にいくつかに分かれる。
通常の変数、引数変数、for
で宣言した変数、setlocal enabledelayedexpansion
で展開され、最終的に他のコマンドやバッチファイル およびcall
による関数等として使用される。
展開される順序は以下の順序になる。
%var%
形式の変数, 引数(%n
)
引数変数nは0だとシェルのパス、1~9なら当該バッチ(または関数)の引数に展開される。コード読み込み時に展開されるため、for文などの中に入れるとループ処理が始まる前に解釈され、ループ処理中は固定値になってしまう。また、入れ子にできないため、%var[%index%]%のような表記もできない。
for
文の変数
for
文で宣言する変数。ループ毎に展開される。
遅延展開変数。
!var!
形式の変数。コマンド呼び出しとして解釈される直前に展開される。setlocal enabledelayedexpansion
を宣言すると、対応するendlocal
までの間で使用可能になる。通常の変数などを入れ子にできる
以下のコードを実行すると、
setlocal enabledelayedexpansion
set var[1]=aaa
for /l %I in (1, 1, 1) do (
set index=1
echo var[%index%]
echo var[%I]
echo !var[%index%]!
echo !var[%I]!
)
endlocal
各echo
の出力は、一つ目が`var[]'、二つ目が`var[1]'、三つ目は`ECHOは <ON>です。'、4つ目が`aaa'。意図するところは4つめだろう。
0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム