Jacl での wsadmin スクリプトの使用 (非推奨)
Jacl は、TCL の代替実装であり、すべて Java™ コードで書き込まれています。
wsadmin ツールは Jacl V1.3.2 を使用します。
wsadmin ツールにおける Jacl 構文の安定化
Jacl 言語は、この製品のバージョン 7 で安定化されました。 IBM® は現在のところ、この機能を以降の本製品のリリースで非推奨にすることも除去することも計画していません。しかし将来は、戦略的な代替機能である Jython 言語に投資の重点が置かれます。Jacl を使用する既存のアプリケーションおよびスクリプトを変更する必要はありませんが、新規アプリケーションに対しては戦略的代替機能の使用を検討してください。
- 管理コンソール・コマンド支援 - コンソールと対話するユーザーにより行われるアクションと同等の wsadmin コマンドを表示する、管理コンソールのフィーチャーです。コンソール・コマンド支援フィーチャーの出力は、WebSphere Application Server ツールに直接送信できます。このツールは、管理コンソールのアクションに基づく Jython スクリプトの開発を簡素化します。プレーン・テキスト・ファイルでコンソール・コマンド支援フィーチャーを使用した後で出力を保存し、後で使用できるようにすることもできます。
- Jacl-Jython 変換ユーティリティー - Jacl 構文の wsadmin スクリプトを同等の Jython 構文の wsadmin スクリプトに変換するプログラムです。数十の新規の高水準 wsadmin コマンドが、単純パラメーターと洗練されたデフォルト・ロジックの使用により、スクリプトを基本管理モデルから分離します。
基本構文
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 my_info] {set my_info 0} else {incr my_info}
コマンド置換
置換の 2 番目の形式はコマンド置換です。 ネストされたコマンドは、大括弧 [ ] で区切られます。 Jacl インタープリターは、大括弧でくくられているものをすべて評価し、 それを 1 つのコマンドとして評価します。 以下に例を示します。
set len [string length my_string]
=> 6
この例では、ネストされたコマンドは string length my_string です。string コマンドは、ストリングでの各種の操作を実行します。 この場合、このコマンドは、 ストリング my_string の長さを求めています。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 つのグローバル・スコープがあります。 あるプロシージャーを別のプロシージャー内に定義できますが、 そのプロシージャーはどこからも可視です。 変数とプロシージャーには、異なる名前空間があるため、 プロシージャーと変数を同じ名前で競合することなく持つことができます。 各プロシージャーには、変数用のローカル・スコープがあります。 プロシージャー内に導入された変数は、プロシージャー・コールの存続期間のみ存在します。 プロシージャーが戻された後、それらの変数は未定義となります。 同じ変数名が外部スコープに存在する場合、 同じ変数名は、その変数名をプロシージャー内で使用しても影響を受けません。 プロシージャーの外部で定義された変数は、 グローバル・スコープ・コマンドを使用しない限り、プロシージャーには不可視です。
グローバル・スコープ は、最上位のスコープです。このスコープは、すべてのプロシージャーの外にあります。 変数は、global コマンドを使用して、 プロシージャー内にあるコマンドにアクセス可能なグローバル・スコープで定義する必要があります。 global コマンドの構文は、以下のとおりです。
global varName1 varName2 ...
コメント
コメントを作成するには、ポンド記号 (#) を使用します。
コマンド行引数
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 string1 index1 | 指定されたインデックスにある文字を戻します。 |
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 my_item z
=> z
append my_item 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 内の文字をリスト・エレメント間の境界として使用します。 |
配列
set arr(index) value
配列エレメントの値を取得するには、 ドル記号 ($) を置換します。 以下に例を示します。
set my_item $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 によって識別された検索を終了します。 |
制御フロー・コマンド
以下のループ・コマンドが存在します。
- while
- foreach
- for
以下は条件コマンドです。
- if
- switch
以下は、エラー処理コマンドです。
- catch
以下のコマンドは、制御フローを微調整します。
- break
- continue
- return
- error
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
switch コマンドを使用して、 表現の値に応じて多くのコマンドの 1 つにブランチします。 パターン・マッチングや、単純な比較に基づいて選択できます。 任意の数のパターン/本体のペアを指定できます。 複数のパターンが一致する場合、 最初のパターン・マッチングのコード本体のみが評価されます。 コマンドの一般的な形式は、以下のとおりです。
switch flags value pat1 body1 pat2 body2 ...
また、 すべてのパターン/本体のペアを以下のように 1 つの引数にグループ化することもできます。
switch flags value {pat1 body1 pat2 body2 ...}
値をどのようにマッチングするかを決定するフラグには、以下の 4 つが考えられます。
- -exact 値を正確にパターンの 1 つにマッチングします。
- -glob グロブ (ワイルドカード) スタイルのパターン・マッチングを使用します。
- -regexp 正規表現パターン・マッチングを使用します。
- -- フラグなし (またはフラグの終了)。 値をダッシュ (-) で開始できる場合に便利です。
以下に例を示します。
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 コマンドは、 実際に変数を定義するグローバル名前空間エントリーを指すロ ーカル名前空間内にエントリーを作成します。
wsadmin ツールによって 提供されたスクリプト・オブジェクトを proc 内で使用 する場合、使用する前にそれをグローバルに宣言する必要があります。以下に例を示します。
proc { ... } {
global AdminConfig
... [$AdminConfig ...]
}
別のスクリプトによるスクリプトの呼び出し
Jacl スクリプトを別の Jacl スクリプトから呼び出すには、source コマンドを使用します。 以下に例を示します。
test1.jacl というスクリプトを作成します。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
source c:/temp/script/testProcedure.jacl
printName Cathy Smith
![[z/OS]](../images/ngzos.gif)
source /temp/script/testProcedure.jacl
printName Cathy Smith
testProcedure.jacl というスクリプトを作成します。
proc printName {first last} {
puts "My name is $first $last"
}
スクリプト引数として以下のパスを渡します。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
wsadmin -lang jacl -f c:/temp/script/test1.jacl
![[z/OS]](../images/ngzos.gif)
wsadmin -lang jacl -f '/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 コマンド・リダイレクトを実行することができる場合もありま す。