WebSphere Application Server Network Deployment, Version 6.0.x   
             オペレーティング・システム: AIX , HP-UX, Linux, Solaris, Windows

             目次と検索結果のパーソナライズ化

Jacl

Jacl は、TCL の代替インプリメンテーションであり、すべて Java コードで書き込まれています。

wsadmin ツールは Jacl V1.3.1 を使用します。

基本構文:

Jacl コマンドの基本構文は、以下のとおりです。
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 コマンドは、変数に値を割り当てます。 このコマンドは、2 つの引数、変数の名前および値を取ります。 変数名は、任意の長さにすることができ、大/小文字が区別さ れます。 Jacl 変数は、使用する前に宣言する必要はありません。 Jacl 変数が最初に値を割り当てられると、インタープリターが変数を作成します。 以下に例を示します。
set a 5
=> 5
set b $a
=> 5
2 番目の例では、変数 a の値を変数 b に割り当てています。 ドル記号 ($) の使用は、変数置換を示しています。 unset コマンドを使用すると、変数を削除することができます。 以下に例を示します。
unset varName1 varName2 ... 
unset コマンドには任意の数の変数を渡すことができます。 変数がまだ定義されていない場合、 unset コマンドはエラーを出します。 unset コマンドを使用すると、 配列全体または 1 つの配列エレメントのみを削除することができます。 配列に unset コマンドを使用することは、 大きなデータ構造を消去する簡単な方法です。 変数の存在は、 info exists コマンドを使用してテストすることができます。 incr パラメーターは最初に変数が存在していることを必要とするため、 変数の存在をテストしなければならない場合があります。 以下に例を示します。
if ![info exists foobar] {set foobar 0} else {incr foobar}

コマンド置換

置換の 2 番目の形式はコマンド置換です。 ネストされたコマンドは、大括弧 [ ] で区切られます。 Jacl インタープリターは、大括弧でくくられているものをすべて評価し、 それを 1 つのコマンドとして評価します。 以下に例を示します。
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

数式:

Jacl インタープリターは数式を評価しません。 数式を評価するには、expr コマンドを使用します。 expr コマンドのインプリメンテーションは、 すべての引数を取り、それらを 1 つのストリングに連結して、 そのストリングを 1 つの数式として構文解析します。 expr コマンドが解答を計算した後、 解答はストリングにフォーマット設定されて戻されます。 以下に例を示します。
expr 7.2 / 3
=> 2.4

円記号 (¥) 置換:

Jacl インタープリターが行う置換の最後のタイプは、バックスラッシュ置換です。 これを使用して、 インタープリターに対して特別の意味を持つ文字を引用します。 例えば、リテラルのドル記号、中括弧、または大括弧をバックスラッシュで引用して、 指定することができます。 たくさんのバックスラッシュを使用する場合は、 代わりに、中括弧で対象をグループ化し、 特殊文字の解釈をすべてオフにすることができます。 バックスラッシュが必要な場合があります。 以下に例を示します。
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 番目のコマンドでは、置換が阻止されたため、 ストリングはそのままプリントされています。

Jacl 言語では円記号 (¥) 文字をエスケープ文字として使用するため、 パス記述の際にも特に注意する必要があります。 これを修正するには、分散パス・ステートメントでは、 円記号 (¥) をスラッシュで置き換えるか、 あるいは二重の円記号 (¥¥) を使用します。 例: C:/ または C:¥¥

プロシージャーとスコープ:

Jacl では、proc コマンドを使用してプロシージャーを定義します。 プロシージャーを定義する基本構文は、以下のとおりです。
proc  name  arglist  body
1 番目の引数は、定義されるプロシージャーの名前です。 名前では、大/小文字が区別され、 実際に任意の文字を含むことができます。プロシージャー名と変数名は、互いに競合することはありません。 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 コマンドは、特定の値を戻すために使用できます。
プロシージャー名には、1 つのグローバル・スコープがあります。 あるプロシージャーを別のプロシージャー内に定義できますが、 そのプロシージャーはどこからも可視です。 変数とプロシージャーには、異なるネーム・スペースがあるため、 プロシージャーと変数を同じ名前で競合することなく持つことができます。 各プロシージャーには、変数用のローカル・スコープがあります。 プロシージャー内に導入された変数は、プロシージャー呼び出しの存続期 間のみ存在します。 プロシージャーが戻された後、それらの変数は未定義となります。 同じ変数名が外部スコープに存在する場合、 同じ変数名は、その変数名をプロシージャー内で使用しても影響を受けません。 プロシージャーの外部で定義された変数は、 グローバル・スコープ・コマンドを使用しない限り、プロシージャーには不可視です。

コメント

コメントを作成するには、ポンド記号 (#) を使用します。

コマンド行引数

Jacl シェルは、コマンド行引数を argv 変数の値としてスクリプトに渡します。 コマンド行引数の数は、argc 変数によって指定されます。 プログラムまたはスクリプトの名前は、argv の一部ではなく、 argc によってカウントされることもありません。 argv 変数は 1 つのリストです。 lindex コマンドを使用して、引数リストから項目を抽出します。 以下に例を示します。
set  first  [lindex  $argv  0]
set  second  [lindex  $argv  1]

ストリングとパターン・マッチング

ストリングは、Jacl 言語における基本データ項目です。 ストリングの取り扱いに使用できるコマンドは、いくつかあります。 string コマンドの一般的な構文は、以下のとおりです。
string operation stringvalue otherargs
operation 引数は、 ストリングのアクションを決定します。 2 番目の引数は、ストリング値です。 操作によっては、追加の引数がある場合があります。
以下の表に、string コマンドの要約を含めます。
コマンド 説明
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 コマンド

append コマンドの 1 番目の引数は、変数名です。 これは、残りの引数を名前付き変数の現行値に連結します。 以下に例を示します。
set  foo  z
=> z

append  foo a b c
=> zabc

regexp コマンド

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 内の文字をリスト・エレメント間の境界として使用します。

配列

配列は、Jacl 言語におけるもう一方の基本データ構造です。 配列はストリング値インデックスを持つ変数であるため、 配列を、ストリングからストリングへのマッピングであると考えることができます。 内部的には、配列はハッシュ・テーブルを使用してインプリメントされます。 各エレメントにアクセスするコストは、ほぼ同じです。 配列のインデックスは、小括弧で区切られます。 インデックスは、任意のストリング値を持つことができ、 その値は変数置換またはコマンド置換の結果であってもかまいません。 配列エレメントは、set コマンドを使用して定義されます。 以下に例を示します。
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 コマンドは、基本的な条件コマンドです。 これは、式が真である場合は、2 行目のコードを実行し、 式が真でない場合には、別の行のコードを実行するということです。 2 番目のコマンド本体 (ELSE 節) はオプションです。 コマンドの構文は以下のとおりです。
if  boolean  then  body1  else  body2
then および else キーワードはオプションです。 以下に例を示します。
if {$x == 0} {
 puts stderr "Divide by zero!"
} else {
 set slope [expr $y/$x]
}

スイッチ

switch コマンドを使用して、 表現の値に応じて多くのコマンドの 1 つにブランチします。 パターン・マッチングや、単純な比較に基づいて選択できます。 任意の数のパターン/本体のペアを指定できます。 複数のパターンが一致する場合、 最初のパターン・マッチングのコード本体のみが評価されます。 コマンドの一般的な形式は、以下のとおりです。
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 コマンドは、コマンド本体にループオーバーし、 ループ変数をリスト内のそれぞれの値に割り当てます。 構文は以下のとおりです。
foreach loopVar valueList commandBody
1 番目 の引数は、変数の名前です。 コマンド本体は、連続した値をリスト内に持つループ変数を使用して、 ループ内の各エレメントに対して 1 回実行します。 以下に例を示します。
set numbers {1 3 5 7 11 13}
foreach num $numbers {
puts $num
}
上記の例からの結果は、環境内にサーバーが 1 つのみ存在すると想定して、 以下のような出力となります。 複数のサーバーが存在している場合は、すべてのサーバーの情報が戻されます。
1
3
5
7
11
13

While

while コマンドは、2 つの引数、test および command body を取ります。 以下に例を示します。
while  booleanExpr  body
while コマンドは、ブール式を繰り返してテストし、 式が真 (ゼロ以外) であれば、本体を実行します。 以下に例を示します。
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 コマンドは、C 言語の for 文に似ています。 これは 4 つの引数を取ります。 以下に例を示します。
for initial test final body
1 番目の引数は、ループを初期化するコマンドです。 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 コマンドを使用して、そのようなエラーをトラップします。 catch コマンドは 2 つの引数を取ります。 以下に例を示します。
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 内の wsadmin ツールによって提供されたスクリプト・オブジェクトを使用する場合は、それをグローバルに宣言してからでないと、使用できません。 以下に例を示します。
proc { ... } {
		global AdminConfig
		... [$AdminConfig ...]
}

別のスクリプトによるスクリプトの呼び出し

Jacl スクリプトを別の Jacl スクリプトから呼び出すには、source コマンドを使用します。 以下に例を示します。

test1.jacl というスクリプトを作成します。

source c:/temp/script/testProcedure.jacl
printName Cathy Smith
testProcedure.jacl というスクリプトを作成します。
proc printName {first last} {
	puts "My name is $first $last"
}

スクリプト引数として以下のパスを渡します。

wsadmin -lang jacl -f c:/temp/script/test1.jacl

パス区切り文字にはスラッシュ (/) を使用してください。円記号 (¥) は機能しません。

exec コマンドを使用したリダイレクト

次のリダイレクト用の Jacl exec コマンドは、Linux プラット フォームの場合、機能しません。
eval exec ls -l > /tmp/out
Jacl スクリプト言語の exec コマンドはリダイレクトを完全にサポー トしていないため、一部のプラットフォームでは問題が生じることがありま す。
Jacl 言語の exec コマンドを使用する場合には、リダイ レクトを使用しないでください。 代わりに、リダイレクト用の exec コマンドを変数に保存し、ファ イルにそれを書き込むことができます。以下に例を示します。
open /tmp/out w puts $fileId $result close $fileId
Tcl に発行されたリダイレクトではなく、shell を使用してのリダイレク トおよび .sh コマンド・リダイレクトを実行することができる場合もありま す。

Jacl の詳細については、 スクリプト: 学習用リソースの項目を参照してください。




関連概念
Jython
関連タスク
スクリプトの入門
関連資料
スクリプト: 学習用リソース
関連情報
http://www.ibm.com/support/docview.wss?rs=180&uid=swg24012144
概念トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 10:13:28 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/cxml_jacl.html