Jacl 是 TCL 的一个备用实现

Jacl 是 TCL 的一个备用实现,它是彻底使用 Java 代码编写的。
wsadmin 工具使用 Jacl V1.3.2。
建议不要在 wsadmin 工具中使用 Jacl 语法
建议不要使用一个产品功能部件并不表示会当即从产品中除去该功能部件。建议不要使用是一个过程,它声明在未来的某个时候除去该功能部件的意向。 WebSphere Application Server 建议不要使用过程要求:在能够除去功能部件以前,该功能部件仍然保留在产品中,时间为两个完整的发布周期。有关建议不要使用的功能部件的更多信息,请参阅不推荐和已除去的功能部件 一文。
wsadmin 管理脚本编制程序支持两种脚本编制语言:Jacl 和 Jython。WebSphere Application Server V6.1 的发布表示声明建议不要使用与 wsadmin 工具关联的 Jacl 语法的过程开始。wsadmin 工具的 Jacl 语法继续保留在产品中且至少受两个主要产品发行版支持。此后,可能会从 wsadmin 工具中除去 Jacl 语言支持。
wsadmin 工具的 Jython 语法是 WebSphere Application Server 管理自动化的策略方向。在 V6.1 发布中,WebSphere Application Server 包含显示加强的管理功能和工具,它们支持产品自动化和 Jython 语法的使用。在 WebSphere Application Server V6.1 中提供了下列新的与 Jython 脚本编制相关的加强功能和部件:
基于 Eclipse 的 Application Server Toolkit 如今包括对自动化脚本编制的强大支持,从而为 wsadmin 脚本提供了完整的功能开发环境,包括 Jython 编辑器、以不一样颜色标记的关键字突出显示、语句补全辅助和脚本调试支持。
管理控制台命令辅助 - WebSphere Application Server 管理控制台的新功能部件,它显示一个 wsadmin 命令,该命令等价于与控制台进行交互的用户执行的操做。能够将控制台命令辅助功能部件的输出直接传送至 WebSphere Application Server Tool,这简化了基于管理控制台操做的 Jython 脚本的开发。还能够在使用控制台命令辅助功能部件以后将输出保存在纯文本文件中,以供未来使用。
Jacl 至 Jython 转换实用程序 - 将 Jacl 语法 wsadmin 脚本转换为等价的 Jython 语法 wsadmin 脚本的程序。许多新的 wsadmin 高级命令,它们经过使用简单的参数和灵活的缺省逻辑来从底层管理模型中对脚本进行解耦。
WebSphere Application Server 脚本编制区域中的全部未来加强功能部件都将以 Jython 语法的使用为中心。虽然,在至少两个完整的发布周期内,Jacl 将保留为随 WebSphere Application Server 交付的组件,可是将不会为 Jacl 语法建立任何新的工具或显式加强功能部件。
基本语法:
Jacl 命令的基本语法以下:
Command    arg1   arg2   arg3   ...
命令能够是一个内置命令名,也能够是一个 Jacl 过程。例如:
puts stdout {Hello, world!}
=> Hello, world!
在 此示例中,命令是 puts,它有两个参数、一个 I/O 流标识和一个字符串。puts 命令将字符串与尾随的新行字符一块儿写入 I/O 流。参数由命令解释。在该示例中,stdout 用于标识标准输出流。将 stdout 用做名称是由 puts 命令和其余 I/O 命令使用的约定。stderr 识别标准错误输出,而 stdin 识别标准输入。
变量
set 命令将值指定给变量。此命令有两个参数:变量的名称和值。变量名能够是任何长度,且区分大小写。使用 Jacl 变量前无须声明它们。解释器将在第一次指定值时建立变量。例如:
set a 5
=> 5
set b $a
=> 5
第二个示例将变量 a 的值指定给变量 b。使用美圆标记($)代表变量替换。您可使用 unset 命令删除变量,例如:
unset varName1 varName2 ...
您 能够将任何数量的变量传递到 unset 命令。若是还没有定义变量,unset 命令将报错。您可使用 unset 命令删除整个数组或只删除单个数组元素。在数组上使用 unset 命令是清除大数据结构的简便方式。能够用 info exists 命令测试变量是否存在。由于 incr 参数首先要求变量存在,因此可能必须测试变量是否存在,例如:
if ![info exists foobar] {set foobar 0} else {incr foobar}
命令替换:
替换的第二种格式是命令替换。嵌套命令由方括号([ ])分隔。Jacl 解释器对方括号中的全部内容求值,并将其做为一条命令求值。例如:
set len [string length foobar]
=> 6
在此示例中,嵌套命令以下:string length foobar。string 命令对字符串执行各类操做。在这种状况下,命令要求字符串 foobar 的长度。单个命令中有几种命令替换状况,解释器从左括号至右括号处理它们。例如:
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 命令的实现采用全部参数,将它们并置到一个字符串中,并将该字符串做为数学表达式进行语法分析。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 {$ {} [] { [ } ]}
=> $ {} [] { [ } ]
您还可使用反斜杠将长命令在多个行上继续。没有反斜杠的新行将终止命令。做为一行中最后字符的反斜杠将转换为空格。例如:
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].
在第二个示例中,Jacl 解释器从 puts 命令在第二个参数上执行变量和命令替换。在第三个命令中阻止替换,所以字符串按原样打印。
 由于 Jacl 语言使用反斜杠字符(\)做为转义字符,因此还必须特别注意路径描述。要修正此问题,可在分布式路径语句中用正斜杠来替换每一个反斜杠,或使用两个反斜杠。例如:C:/ 或 C:\\
过程和做用域:
Jacl 使用 proc 命令定义过程。定义过程的基本语法以下:
proc  name  arglist  body
第一个参数是正在定义的过程的名称。该名称是区分大小写的,实际上它能够包含任何字符。过程名称和变量名不会相互冲突。第二个参数是过程的参数列表。第三个参数是条命令,或更一般是造成过程主体的一组命令。一旦定义 Jacl 过程,它将与任何内置命令同样使用。例如:
proc divide {x y} {
set result [expr $x/$y]
puts $result
}
在脚本中,这是调用 devide 过程的方式:
divide 20 5
它会给出相似如下的结果:
4
在此示例中并不是真正必须使用变量 c。该过程主体也可写为:
return  [expr  sqrt($a  *  $a  +  $b  *  $b)]
此示例中的 return 命令是可选的,由于 Jacl 解释器将主体中最后一条命令值做为过程值返回。所以,该过程主体能够减小为:
expr  sqrt($a  *  $a  +  $b  *  $b)
该过程结果是主体中最后一条命令返回的结果。return 命令可用于返回特定值。
过程名称中存在单个、全局做用域。您能够在另外一个过程当中定义过程,可是在任何位置均可以看到它。变量和过程有不一样的名称空间,所以您的过程和变量能够有同一名称而不会有冲突。每一个过程都有变量的本地做用域。过程当中引入的变量仅在过程调用期间存在。过程返回后,取消定义那些变量。若是外部做用域中存在同一变量名,那么使用过程当中的变量名不会对它产生影响。过程外部定义的变量对于过程不可视,除非使用了全局做用域命令。
global 命令 - 全局做用域是顶级做用域。此做用域在任何过程外。必须经过使用 global 命令使变量在能够访问过程当中命令的全局做用域中定义。global 命令的语法以下:
global  varName1  varName2 ...
注释
使用井号字符(#)进行注释。
命令行参数
Jacl shell 将命令行参数做为 argv 变量的值传递到脚本。命令行参数数由 argc 变量提供。程序或脚本的名称不是 argv 的一部分,也不会由 argc 计数。argv 变量是个列表。使用 lindex 命令从参数列表抽取项,例如:
set  first  [lindex  $argv  0]
set  second  [lindex  $argv  1]
字符串和模式匹配
字符串是 Jacl 语言中的基本数据项。您有多条命令可用于处理字符串。string 命令的通常语法以下:
string operation stringvalue otherargs
operation 参数肯定字符串的操做。第二个参数是字符串值。根据操做,可能还有其余参数。
下表包含 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 返回从 i 到 j 的 str 的字符范围
string tolower string 以小写字母返回字符串。
string toupper string 以大写字母返回字符串。
string trim string ?chars? 从字符串两端修剪 chars 中的字符。chars 缺省为空格。
string trimleft string ?chars? 从字符串开头修剪 chars 中的字符。chars 缺省为空格。
string trimright string ?chars? 从字符串末尾修剪 chars 中的字符。chars 缺省为空格。
string wordend str ix 返回字符的 str 中的索引,该字符在包含索引 ix 的字符的字后。
string wordstart str ix 返回第一个字符的 str 中的索引,该字符在包含索引 ix 的字符的字中。
append 命令
append 命令的第一个参数是变量名。它将剩余的参数并置到命名变量的当前值。例如:
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 语言中的基本数据结构是字符串。其中存在两种更高级别的数据结构:列表和数组。列表做为字符串来实现,而结构由字符串的语法定义。语法规则与命令相同。命令是列表的特殊实例。数组是有索引的变量。索引是字符串值,所以您能够将数组看做是从一个字符串(索引)到另外一个字符串(数组元素值)的映射。
Jacl 列表
Jacl 语言的列表是有特殊解释的字符串。在 Jacl 语言中,列表与命令有同一结构。列表是字符串,具备以空格分隔的列表元素。您可使用花括号或引号将具备空格的字一块儿分组到一个列表元素中。
下表包含有关列表的命令:
命令 描述
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 ... 用 args 替换列表中的元素 i 到 j。返回一个新的列表。
lsearch mode list value 返回根据方式匹配值的列表中元素的索引,分别是 -exact、-glob 或 -regexp,-glob 是缺省值。若是未找到,那么返回 -1。
lsort switches list 根据如下开关符对列表的元素进行排序:-ascii、-integer、-real、-increasing、-decreasing、-command 命令。返回一个新的列表。
concat arg arg arg ... 将多个列表链接起来,成为一个列表。
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 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 在由令牌标识识别的搜索中,返回数组中下一个元素的值。若是搜索中再也不有元素,那么返回空字符串。
array anymore arr id 若是搜索中还有元素,那么返回 1。
array donesearch arr id 结束由 id 识别的搜索。
控制流命令
存在如下循环命令:
while
foreach
for
如下是条件命令:
if
switch
如下是错误处理命令:
catch
如下命令微调控制流:
break
continue
return
error
If Then Else
if 命令是基本条件命令。它说明:若是表达式为真,那么返回第二个代码行,不然运行另外一代码行。第二个命令主体(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 命令分支到多条命令中的某条命令。您能够基于模式匹配和简单比较来进行选择。能够指定任何数量的模式-主体对。若是多个模式匹配,那么只对第一个匹配模式的代码主体求值。该命令的通常格式以下:
switch  flags  value  pat1  body1  pat2  body2  ...
您还能够将全部模式-主体对分组到一个参数中:
switch  flags  value  {pat1  body1  pat2  body2  ...}
有四个可能的标志肯定值如何匹配。
-exact 将值与某个模式彻底匹配。
-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
第一个参数是变量名。命令主体对循环中的每一个元素运行一次,且循环变量有列表中的连续值。例如:
set numbers {1 3 5 7 11 13}
foreach num $numbers {
puts $num
}
假定环境中只存在一台服务器,上一个示例的结果将为如下输出。若是存在多台服务器,那么返回全部服务器的信息:
13 5711
13
While
while 命令采用两个参数;测试和命令主体,例如:
while  booleanExpr  body
若是表达式为 true(非零),那么 while 命令重复测试布尔表达式并运行主体。例如:
set i 0
while {$i < 5} {
puts "i is $i"
incr i}
假定只有一台服务器,上一个示例的结果将相似如下输出。若是存在多台服务器,那么将打印全部服务器:
i is 0
i is 1
i is 2
i is 3
i is 4
For
for 命令相似于 C 语言的 for 语句。它采用四个参数,例如:
for initial test final body
第一个参数是初始化循环的命令。第二个参数是肯定循环主体是否将运行的布尔表达式。第三个参数是在循环主体后运行的命令,例如:
set numbers {1 3 5 7 11 13}
for {set i 0} {$i < [llength $numbers]} {incr i 1} {
puts "i is $i"
}
假定环境中只有一台服务器,上一个示例的结果将相似如下输出。若是存在多台服务器,那么它将打印全部服务器名:
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 命令采用两个参数,例如:
catch command ?resultVar?
第一个参数是命令主体。第二个参数是变量名,它将包含命令结果或错误消息(若是命令产生错误)。若是没有获取错误,那么 catch 命令返回值 0,若是该命令获取了错误,那么返回值 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 命令来返回值。
Namespaces
Jacl 将一些命名实体(例如,变量)保存在名称空间中。wsadmin 工具还将条目添加到脚本编制对象(例如,AdminApp 对象)的全局名称空间。
运行 proc 命令时,用 proc 命令中的参数名称和参数值建立和初始化了本地名称空间。运行 proc 命令时,变量保存在本地名称空间中。中止 proc 命令时,将擦除本地名称空间。proc 命令的本地名称空间实现语言(例如,C 和 Java)中自动变量的语义。
当全局名称空间中的变量对于顶层代码可视时,缺省状况下它们从 proc 命令内不可视。要使它们可视,请使用 global 命令全局声明这些变量。对于您提供的变量名,全局命令在本地名称空间中建立条目,它们指向实际定义这些变量的全局名称空间条目。
若是在 proc 中使用 wsadmin 工具提供的脚本编制对象,那么必须在可使用它前先全局声明,例如:
proc { ... } {
  global AdminConfig
  ... [$AdminConfig ...]
}
使用一个脚本调用其余脚本
请使用 source 命令来从一个 Jacl 脚本调用另外一个 Jacl 脚本。例如:
建立称为 test1.jacl 的脚本。
 
source c:/temp/script/testProcedure.jacl
printName Cathy Smith
 
source /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
 
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 在某些状况下,还可使用 shell 和 .sh 命令重定向(而不是 Tcl 发出的重定向)来执行重定向。 要获取更多有关 Jacl 的信息,请参阅脚本编制:学习资源一文
相关文章
相关标签/搜索