Jacl は、TCL の代替インプリメンテーションであり、すべて Java コードで書き込まれています。
wsadmin ツールは Jacl V1.3.1 を使用します。
基本構文:
Command arg1 arg2 arg3 ...コマンドは、組み込みコマンドの名前か Jacl プロシージャーかのいずれかです。 以下に例を示します。
puts stdout {Hello, world!} => Hello, world!この例では、コマンドは puts です。 このコマンドは、2 つの引数 (I/O ストリーム ID およびストリング) を取ります。 puts コマンドはこのストリングを末尾の改行文字と共に I/O ストリームに書き込みます。 引数は、コマンドによって解釈されます。 例では、標準出力ストリームを識別するために stdout を使用しています。 名前として stdout を使用することは、 puts コマンドおよびその他の I/O コマンドに用いられる規則です。 stderr は標準エラー出力を識別し、stdin は標準入力を識別します。
変数
set a 5 => 5
set b $a => 52 番目の例では、変数 a の値を変数 b に割り当てています。 ドル記号 ($) の使用は、変数置換を示しています。 unset コマンドを使用すると、変数を削除することができます。 以下に例を示します。
unset varName1 varName2 ...unset コマンドには任意の数の変数を渡すことができます。 変数がまだ定義されていない場合、 unset コマンドはエラーを出します。 unset コマンドを使用すると、 配列全体または 1 つの配列エレメントのみを削除することができます。 配列に unset コマンドを使用することは、 大きなデータ構造を消去する簡単な方法です。 変数の存在は、 info exists コマンドを使用してテストすることができます。 incr パラメーターは最初に変数が存在していることを必要とするため、 変数の存在をテストしなければならない場合があります。 以下に例を示します。
if ![info exists foobar] {set foobar 0} else {incr foobar}
コマンド置換
set len [string length foobar] => 6この例では、 ネストされたコマンドは string length foobar です。 string コマンドは、ストリングでの各種の操作を実行します。 この場合、このコマンドは、ストリング foobar の長さを求めています。 1 つのコマンド内にコマンド置換のケースがいくつかある場合、 インタープリターは、それらを左の大括弧から右の大括弧へと処理します。 以下に例を示します。
set number "1 2 3 4" => 1 2 3 4
set one [lindex $number 0] => 1
set end [lindex $number end] => 4
set another {123 456 789} => 123 456 789
set stringLen [string length [lindex $another 1]] => 3
set listLen [llength [lindex $another 1] => 1
数式:
expr 7.2 / 3 => 2.4
円記号 (¥) 置換:
set dollar "This is a string ¥$contain dollar char" => This is a string $contain dollar char set x $dollar => This is a string $contain dollar char set group {$ {} [] { [ } ]} => $ {} [] { [ } ]また、バックスラッシュを使用して、長いコマンドを複数の行に継続することもできます。 バックスラッシュのない新しい行は、コマンドを強制終了します。 行上で最後の文字となるバックスラッシュは、 1 つのスペースに変換されます。 以下に例を示します。
set totalLength [expr [string length "first string"] + ¥ [string length "second string"]] => 25
中括弧と二重引用符を使用したグループ化:
set s Hello => Hello puts stdout "The length of $s is [string length $s]." => The length of Hello is 5. puts stdout {The length of $s is [string length $s].} => The length of $s is [string length $s].2 番目の例では、Jacl インタープリターは、 puts コマンドからの 2 番目の引数に対して変数とコマンドの置換を実行しています。3 番目のコマンドでは、置換が阻止されたため、 ストリングはそのままプリントされています。
プロシージャーとスコープ:
proc name arglist body1 番目の引数は、定義されるプロシージャーの名前です。 名前では、大/小文字が区別され、 実際に任意の文字を含むことができます。プロシージャー名と変数名は、互いに競合することはありません。 2 番目の引数は、プロシージャーに対するパラメーターのリストです。 3 番目の引数は、コマンドまたは、 たいていはプロシージャー本体を形成するコマンドのグループです。 いったん定義すると、 Jacl プロシージャーは、他の組み込みコマンドの場合と全く同様に使用され ます。 以下に例を示します。
proc divide {x y} { set result [expr $x/$y] puts $result }スクリプトの内部では、 除算プロシージャーを呼び出す方法を示しています。
divide 20 5そして、これは以下のような結果を出します。
4この例では、変数 c を使用する必要は必ずしもありません。 このプロシージャー本体は、以下のように書き込むこともできます。
return [expr sqrt($a * $a + $b * $b)]この例では、return コマンドはオプションです。 これは、Jacl インタープリターが本体内の最後のコマンドの値をプロシージャーの値として戻すためです。 このため、プロシージャー本体は以下のように短縮することができます。
expr sqrt($a * $a + $b * $b)プロシージャーの結果は、 本体内の最後のコマンドによって戻された結果です。 return コマンドは、特定の値を戻すために使用できます。
global varName1 varName2 ...
コメント
コメントを作成するには、ポンド記号 (#) を使用します。
コマンド行引数
set first [lindex $argv 0] set second [lindex $argv 1]
ストリングとパターン・マッチング
string operation stringvalue otherargsoperation 引数は、 ストリングのアクションを決定します。 2 番目の引数は、ストリング値です。 操作によっては、追加の引数がある場合があります。
コマンド | 説明 |
string compare str1 str2 | ストリングを辞書学的に比較します。 等しければ 0 を戻し、str1 が str2 の前にソートされる場合は -1 を戻し、 それ以外の場合は 1 を戻します。 |
string first str1 str2 | str1 の最初の出現の str2 でインデックスを戻し、 あるいは、str1 が見つからない場合は -1 を戻します。 |
string index string index | 指定されたインデックスにある文字を戻します。 |
string last str1 str2 | str1 の最後の出現の str2 でインデックスを戻し、 あるいは、str1 が見つからない場合は -1 を戻します。 |
string length string | ストリング内の文字の数を戻します。 |
string match pattern str | str がパターンと一致する場合は 1 を戻し、 それ以外の場合は 0 を戻します。 |
string range str i j | str 内の文字の範囲を i から j で戻します。 |
string tolower string | ストリングを小文字で戻します。 |
string toupper string | ストリングを大文字で戻します。 |
string trim string ?chars? | char 内の文字をストリングの両端から切り取ります。 char はデフォルトでは空白となります。 |
string trimleft string ?chars? | char 内の文字をストリングの先頭から切り取ります。 char はデフォルトでは空白となります。 |
string trimright string ?chars? | char 内の文字をストリングの終端から切り取ります。 char はデフォルトでは空白となります。 |
string wordend str ix | インデックス ix で文字を含むワードの後ろの文字の str でインデックスを戻します。 |
string wordstart str ix | インデックス ix で文字を含むワード内の最初の文字の str でインデックスを戻します。 |
append コマンド
set foo z => z append foo a b c => zabc
regexp コマンド
regexp ?flags? pattern string ?match sub1 sub2 ...?ストリングの一部がパターンと一致する場合、 戻り値は 1 です。 それ以外の場合、戻り値は 0 です。 パターンは、ストリング全体と一致する必要はありません。 これ以上の制御が必要な場合は、 パターンを ^ で開始することによって、パターンをストリングの先頭に固定するか、 あるいは、パターンをドル記号 $ で終了することによって、 パターンをストリングの終端に固定することができます。 両方の文字を使用することによって、 ストリング全体に一致するようにパターンに強制することができます。 以下に例を示します。
set text1 "This is the first string" => This is the first string regexp "first string" $text1 => 1 regexp "second string" $text1 => 0
Jacl データ構造
Jacl 言語における基本データ構造はストリングです。 高水準データ構造としては、リストと配列の 2 つがあります。 リストはストリングとしてインプリメントされ、 構造はストリングの構文によって定義されます。 構文規則は、コマンドの場合と同じです。 コマンドは、リストの特定のインスタンスです。 配列は、インデックスを持つ変数です。 インデックスはストリング値であるため、配列を、 あるストリング (インデックス) から別のストリング (配列エレメントの値) へのマップであると考えることができます。
Jacl リスト
Jacl 言語のリストは、特殊な解釈を伴うストリングです。 Jacl 言語では、リストはコマンドと同じ構造を持ちます。 リストは、リスト・エレメントが空白によって区切られているストリングです。 中括弧または引用符を使用して、 ワードを空白と一緒にグループ化して 1 つのリスト・エレメントにすることができます。
コマンド | 説明 |
list arg1 arg2 | すべての引数からリストを作成します。 |
lindex list i | リストから i 番目のエレメントを戻します。 |
llength list | リスト内のエレメントの数を戻します。 |
lrange list i j | リストの i 番目から j 番目までのエレメントを戻します。 |
lappend listVar arg arg ... | listVar の値にエレメントを付加します。 |
linsert list index arg arg ... | 位置インデックスにあるエレメントの前のリストにエレメントを挿入します。 新規リストを戻します。 |
lreplace list i j arg arg ... | リストのエレメント i から j までを arg で置換します。 新規リストを戻します。 |
lsearch mode list value | リスト内のエレメントのインデックスを戻します。 このリストは、-exact、-glob、または -regexp、-glob がデフォルトであるモードに応じた値と一致します。 見つからない場合は、-1 を戻します。 |
lsort switches list | スイッチの -ascii、-integer、-real、-increasing、-decreasing、 -command コマンドに応じて、リストのエレメントをソートします。 新規リストを戻します。 |
concat arg arg arg ... | 複数のリストを一緒に結合して 1 つのリストにします。 |
join list joinString | リストのエレメントを joinString で分離して、一緒にマージします。 |
split string splitChars | ストリングをリスト・エレメントに分割します。 これには、splitChars 内の文字をリスト・エレメント間の境界として使用します。 |
配列
set arr(index) value配列エレメントの値を取得するには、 ドル記号 ($) を置換します。 以下に例を示します。
set foo $arr(index)以下に例を示します。
set fruit(best) kiwi => kiwi set fruit(worst) peach => peach set fruit(ok) banana => banana array get fruit => ok banana worst peach best kiwi array exists fruit => 1以下の表に、array コマンドを含めます。
コマンド | 説明 |
array exists arr | arr が配列変数である場合、1 を戻します。 |
array get arr | インデックスと対応する配列値とを代替するリストを戻します。 |
array names arr ?pattern? | arr 用に定義されたすべてのインデックスのリスト、 またはストリング・マッチ・パターンと一致するインデックスのリストを戻します。 |
array set arr list | リストから配列 arr を初期化します。 このリストは、get によって戻されたリストと同じ形式を持っていなければなりません。 |
array size arr | arr 用に定義されたインデックスの数を戻します。 |
array startsearch arr | arr を介した検索用の検索トークンを戻します。 |
array nextelement arr id | トークン ID によって識別された検索での配列内の次のエレメントの値を戻します。 検索に残っているエレメントがない場合、空ストリングを戻します。 |
array anymore arr id | 検索にエレメントが残っている場合、1 を戻します。 |
array donesearch arr id | id によって識別された検索を終了します。 |
制御フロー・コマンド
If Then Else
if boolean then body1 else body2then および else キーワードはオプションです。 以下に例を示します。
if {$x == 0} { puts stderr "Divide by zero!" } else { set slope [expr $y/$x] }
スイッチ
switch flags value pat1 body1 pat2 body2 ...また、 すべてのパターン/本体のペアを以下のように 1 つの引数にグループ化することもできます。
switch flags value {pat1 body1 pat2 body2 ...}値をどのようにマッチングするかを決定するフラグには、以下の 4 つが考えられます。
switch -exact -- $value { foo {doFoo; incr count(foo)} bar {doBar; return $count(foo)} default {incr count(other)} }最後の本体と関連付けられているパターンが default である場合に、 ほかのパターンが一致しないと、コマンド本体が開始されます。 default キーワードは、最後のパターン/本体のペアにのみ機能します。 デフォルトのパターンを旧バージョンの本体に使用すると、 リテラル・ストリングのデフォルトにマッチングするパターンとして処理されます。
Foreach
foreach loopVar valueList commandBody1 番目 の引数は、変数の名前です。 コマンド本体は、連続した値をリスト内に持つループ変数を使用して、 ループ内の各エレメントに対して 1 回実行します。 以下に例を示します。
set numbers {1 3 5 7 11 13} foreach num $numbers { puts $num }上記の例からの結果は、環境内にサーバーが 1 つのみ存在すると想定して、 以下のような出力となります。 複数のサーバーが存在している場合は、すべてのサーバーの情報が戻されます。
1 3 5 7 11 13
While
while booleanExpr bodywhile コマンドは、ブール式を繰り返してテストし、 式が真 (ゼロ以外) であれば、本体を実行します。 以下に例を示します。
set i 0 while {$i < 5} { puts "i is $i" incr i}上記の例からの結果は、サーバーが 1 つのみ存在すると想 定して、以下のような出力となります。 複数のサーバーが存在する場合は、すべてのサーバーをプリントします。
i is 0 i is 1 i is 2 i is 3 i is 4
For
for initial test final body1 番目の引数は、ループを初期化するコマンドです。 2 番目の引数はブール式であり、 これにより、ループ本体を実行するかどうかが判別されます。 3 番目の引数は、ループ本体の後で実行するコマンドです。 以下に例を示します。
set numbers {1 3 5 7 11 13} for {set i 0} {$i < [llength $numbers]} {incr i 1} { puts "i is $i" }上記の例からの結果は、環境内にサーバーが 1 つのみ存在すると想定して、 以下のような出力となります。 複数のサーバーが存在する場合は、すべてのサーバー名をプリントします。
i is 1 i is 3 i is 5 i is 7 i is 11 i is 13
Break と continue
break および continue コマンドを使用して、 ループ実行を制御できます。 break コマンドは、ループを即時に終了させます。 continue コマンドは、ループを次の反復へ継続させます。
Catch
catch command ?resultVar?1 番目の引数は、コマンド本体です。 2 番目の引数は、変数の名前です。 この変数は、コマンドがエラーを引き起こした場合に、 コマンドの結果や、エラー・メッセージを格納します。 catch コマンドは、エラーがキャッチされなかった場合は、値のゼロを戻し、 コマンドがエラーをキャッチした場合は、値の 1 を戻します。 以下に例を示します。
catch {expr 20 / 5} result ==> 0 puts $result ==> 4 catch {expr text / 5} result ==> 1 puts $result ==> syntax error in expression "text / 5"
Return
プロシージャー本体の終了の前に、あるいは対比値を戻す必要がある場合に、 return コマンドを使用して値を戻します。
ネーム・スペース
Jacl は、変数などの名前付きエンティティーをネーム・スペース内で常に把握しています。 wsadmin ツールも、 AdminApp オブジェクトなどのスクリプト・オブジェクト用のグローバル・ネ ーム・スペースにエントリーを追加します。
proc コマンドを実行すると、ローカル・ネーム・スペースが作成され、 proc コマンド内のパラメーターの名前と値を使用して初期化されます。 proc コマンドを実行している間、 変数はローカル・ネーム・スペース内に保持されます。 proc コマンドを停止すると、ローカル・ネーム・スペースは消去されます。 proc コマンドのローカル・ネーム・スペースは、 自動変数のセマンティクスを C や Java などの言語でインプリメントします。
グローバル・ネーム・スペース内の変数は、トップレベル・コードに可視であるのに対して、 デフォルトでは proc コマンド内からは不可視です。 これらを可視にするには、 global コマンドを使用して変数をグローバルに宣言します。 指定する変数名に関して、global コマンドは、 実際に変数を定義するグローバル・ネーム・スペース・エントリーを指すロ ーカル・ネーム・スペース内にエントリーを作成します。
proc { ... } { global AdminConfig ... [$AdminConfig ...] }
別のスクリプトによるスクリプトの呼び出し
Jacl スクリプトを別の Jacl スクリプトから呼び出すには、source コマンドを使用します。 以下に例を示します。
test1.jacl というスクリプトを作成します。
source /temp/script/testProcedure.jacl printName Cathy Smith
proc printName {first last} { puts "My name is $first $last" }
スクリプト引数として以下のパスを渡します。
wsadmin -lang jacl -f '/temp/script/test1.jacl'
パス区切り文字にはスラッシュ (/) を使用してください。円記号 (¥) は機能しません。
exec コマンドを使用したリダイレクト
eval exec ls -l > /tmp/outJacl スクリプト言語の exec コマンドはリダイレクトを完全にサポー トしていないため、一部のプラットフォームでは問題が生じることがありま す。
open /tmp/out w puts $fileId $result close $fileIdTcl に発行されたリダイレクトではなく、shell を使用してのリダイレク トおよび .sh コマンド・リダイレクトを実行することができる場合もありま す。
Jacl の詳細については、 スクリプト: 学習用リソースの項目を参照してください。