Systemwalkerスクリプトの文法について説明します。
変数
変数名は、アルファベットで始まる任意の長さの英数字が使用できます。大文字と小文字は区別され、また“_”(アンダーバー)を含むことができます。
ポイント
環境変数
環境変数は、予約変数“env”にあらかじめ格納されています。
スクリプト内では、“env”の直後に個々の環境変数名を“()”(小括弧)で指定した変数名として扱い、環境変数の参照/更新は、env(環境変数名)に対して行います。
予約変数envを使用する場合は、参照/更新より前に以下を記述してください。
global env
例:環境変数“PATH”の参照/更新に使用する変数名
env(PATH)
構文
構成
Systemwalkerスクリプトは、コマンド文の集まりで構成されています。スクリプトの記述内容は、本章の文法、およびコマンドの説明の範囲内で任意です。コマンド文の記述形式は、以下のとおりです。
コマンド オプション引数
スクリプトファイル内は、以下のコマンド文の集まりになっています。
コマンド文 … … … …
コマンドの区切り
スクリプト行は、“;”(セミコロン)か改行が、コマンドの区切りとなります。
例:変数abc,defにそれぞれ値を格納する場合
set abc ABC set def DEF
または、
set abc ABC ; set def DEF
“$”(ダラー記号)による変数置換
変数置換は、“$”(ダラー記号)を使用します。
変数置換とは、変数に格納した値を参照することです。変数に格納した値が未設定の場合に、変数置換を行うとスクリプトエラーとなり、異常終了します。
例:変数abcに格納した値を別の変数defに格納する場合
set abc ABC set def $abc
“[]”(大括弧)によるコマンド置換
スクリプトのコマンドには、復帰値を返すものがあります。
コマンド置換とは、呼び出し元でのコマンド呼び出しを行った場合の復帰値の参照にあたります。コマンド置換は、“[]”(大括弧)を使用します。
例:算術演算(3+2)の結果を変数abcに格納する場合
set abc [ expr 3 + 2 ]
コマンド内のワードの区切り
コマンド内のワードの区切りは、スペース、またはタブを使用します。
ワードの区切りとは、コマンド名と第1引数、第2引数…間の区切りのことです。
ワード内の変数置換/コマンド置換
ワード内に“$”(ダラー記号)が含まれる場合、変数置換が行われ、変数の内容に置き換えられます。
ワード内に“[]”(大括弧)が含まれる場合は、コマンド置換が行われ、コマンド実行結果の復帰値に置き換えられます。
コマンド置換は、再帰的に行われますが、変数置換は一度しか行われません。
例:ワード内にある変数abcが変数置換される場合
set abc "123" set str xyz$abc
この場合、変数strには文字列 "xyz123" が入ります。
ただし、以下の記述では変数置換は正しく行われません。
set abc "123" set str $abcxyz
この場合、abcxyz が変数と解釈されるため、未定義変数の参照により、エラーとなります。
例:再帰的にコマンド置換を行い、計算結果を格納する場合
set abc [ expr [expr 1 + 1] + 2 ]
注意
exprコマンドは、入れ子の計算式も解釈可能なため、算術演算だけの場合は、以下の記述をします。
set abc [ expr (1 + 1) + 2 ]
“"”(ダブルクォーテーション)によるワードの指定
ワードの最初の文字が“"”(ダブルクォーテーション)の場合は、次のダブルクォーテーションまでが1つのワードとして扱われます。
ワードの最初の文字がダブルクォーテーションで、それに対応する終了ダブルクォーテーションがない場合は、文法エラーとなります。
また、開始と終了のダブルクォーテーション自体は、ワードの内容としては解釈されません。
例:文字列123を変数abcに格納する場合
set abc "123"
直前に“\”(円記号)がある場合、ダブルクォーテーションは、ワード囲み記号として解釈されず、通常の文字として扱われます。
円記号置換については、““\”(円記号)によるエスケープシーケンス(円記号置換)”を参照してください。
例:文字列123"を変数abcへ格納する場合
set abc "123\""
ワード指定のダブルクォーテーションの中に含まれる“;”(セミコロン)、“]”(閉じ括弧)、スペース(改行も含む)は、普通の文字として扱われますが、コマンド置換、変数置換は処理されます。
例:空白、変数置換を含む文字列を格納する場合
set abc "123" set str "abc $abc def"
変数strへ格納される文字列は abc 123 def となります。
“{ }”(中括弧)によるワード指定
ワードの最初の文字が“{”(開き中括弧)の場合は、対応する“}”(閉じ中括弧)までがワードになります。
ワードの最初の文字が開き、中括弧でそれに対応する閉じ中括弧がない場合は、文法エラーとなります。
また、開始と終了の中括弧自体はワードの内容としては解釈されません。
例:文字列1{2}3を変数abcへ格納する場合
set abc {1{2}3}
直前に“\”(円記号)がある場合、中括弧は、ワード囲み記号として解釈されません。ただし、中括弧によるワード囲み内では、“\{”、“\}”を通常文字の“{”、“}”に置き換えることはありません。
詳細については、“ワード囲み記号と円記号置換”を参照してください。
例:中括弧を含む文字列を格納する場合
set abc {123\}}
変数abcへは文字列 123\}が格納されます。
ワード指定の中括弧囲みの中に含まれる“;”(セミコロン)、“]”(閉じ括弧)、スペース(改行も含む)は、普通の文字として扱われ、コマンド置換、変数置換は処理されません。
例:空白を含む文字列を格納する場合
set abc "123" set str {abc $abc def}
変数strへ格納される文字列は abc $abc def となります。
“\”(円記号)によるエスケープシーケンス(円記号置換)
ワードに“\”(円記号)が含まれている場合は、その直後の文字との組み合わせをエスケープシーケンスとして解釈され、円記号置換が行われます。
円記号置換の種類を以下に示します。
シーケンス | 置換内容 |
---|---|
\a | ベル |
\b | バックスペース |
\f | 改ページ |
\n | 改行 |
\r | キャリッジ/リターン |
\t | タブ |
\v | 垂直タブ |
\<改行> | 空白文字(継続行) |
\" | ワード囲み記号として解釈されない単独ダブルクォーテーション |
\{ | ワード囲み記号として解釈されない単独中括弧開き記号 |
\} | ワード囲み記号として解釈されない単独中括弧閉じ記号 |
\\ | 単独円記号“\” |
注意
円記号の直後に、上記以外の文字を指定することはできません。
ワード囲み記号と円記号置換
ダブルクォーテーションで囲まれたワードに対しては、すべての円記号置換が行われますが、中括弧で囲まれたワードに対しては、“\<改行>”を除き、円記号置換は行われません。
例:中括弧内で円記号置換されない場合
set abc "C:\\tmp" set def {C:\tmp}
変数abc,defともに文字列 C:\tmp が格納されます。
例:中括弧内でも円記号置換される場合
set abc "123\ 456" set def {123\ 456}
変数abc,defともに文字列 123 456 が格納されます。
中括弧によるワード囲み内では、“\{”、“\}”は円記号置換されません。
また、“\\”も円記号置換されませんが、後の“\”は“\<改行>”、“\{”、“\}”でのエスケープ文字としての意味を失います。
例:“\”がエスケープ文字としての意味を失う場合
set abc {123\\}
変数abcには文字列 123\\ が格納されます。
注意
以下の文字列を、中括弧で囲んだワードとして記述することはできません。
末尾に円記号がある文字列
C:\tmp\
対応のとれていない中括弧が存在する文字列
123}
改行の直前に円記号がある文字列
C:\tmp\ D:\tmp\
条件式における文字列の扱い
ifやwhileなどの判定文で指定する条件式は、通常は数値式として解釈されます。このため、条件式を文字列式として解釈させたい場合は文字列を「"」(ダブルクォーテーション)で囲む必要があります。真偽値の意味を持つ特別な文字列(yes,no,true,false)を指定する場合でも同様です。
例1:変数aの内容が文字列xyzであるかどうか判定する場合
if {$a == "xyz"} { puts ok }
例2:真である間処理を繰り返す場合
set i 0 while {"true"} { incr i if {$i > 5} { break } }
文字列をダブルクォーテーションで囲んでも、文字列全体が数値として解釈可能な場合は、数値式として判定されます。厳密な文字列比較を行うためには、文字列操作用のstring(文字列を操作する)コマンドを使用して判定を行うことを推奨します。
例:変数aの内容が文字列 01 であるかどうか判定する場合
if {[string compare $a 01] == 0} { puts ok }
上記で、判定文を以下のようにすると、変数aの内容が1や001の場合も真となります。
if {$a == "01"}
コメント行
“#”で始まる行、およびコマンドの最初が“#”の場合は、改行までをコメントと解釈します。
例:
# 変数を初期化する set abc 0
コメントを記述する場合、以下の点に注意してください。
コメント行内には“{”、“}”(中括弧)を使用しないでください。
コメント行、およびコメント行の直前の行で、継続行(\<改行>)は使用しないでください。
ifやwhileなどの判定文で指定する条件式内には、コメントを記述しないでください。
注意事項
Systemwalkerスクリプトで、JIS X 0213:2004で新規に追加された文字を使用することはできません。