Jacl 是 TCL 的一个备用实现
基于 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 语法创建任何新的工具或显式增强功能部件。
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 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}
命令替换:
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
数学表达式:
expr 7.2 / 3
=> 2.4
反斜杠替换:
set dollar "This is a string \$contain dollar char"
=> This is a string $contain dollar char
=> This is a string $contain dollar char
=> $ {} [] { [ } ]
您还可以使用反斜杠将长命令在多个行上继续。没有反斜杠的新行将终止命令。作为一行中最后字符的反斜杠将转换为空格。例如:
set totalLength [expr [string length "first string"] + \
[string length "second string"]]
=> 25
用花括号和双引号分组:
set s Hello
=> Hello
=> The length of Hello is 5.
=> The length of $s is [string length $s].
在第二个示例中,Jacl 解释器从 puts 命令在第二个参数上执行变量和命令替换。在第三个命令中阻止替换,因此字符串按原样打印。
因为 Jacl 语言使用反斜杠字符(\)作为转义字符,所以还必须特别注意路径描述。要修正此问题,可在分布式路径语句中用正斜杠来替换每个反斜杠,或使用两个反斜杠。例如:C:/ 或 C:\\
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 ...
注释
set first [lindex $argv 0]
set second [lindex $argv 1]
字符串和模式匹配
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 的字符的字中。
set foo z
=> z
=> zabc
regexp 命令
regexp ?flags? pattern string ?match sub1 sub2 ...?
如 果字符串的一部分与模式匹配,那么返回值是 1。否则,返回值将为 0。模式不必匹配整个字符串。如果您需要更多控制,那么可以将 ^ 放在模式开头,从而将模式固定到字符串开头,或者可以将美元标记 $ 放在模式末尾,从而将模式固定在字符串末尾。您可以通过使用这两个字符强制模式匹配整个字符串。例如:
set text1 "This is the first string"
=> This is the first string
=> 1
=> 0
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 中的字符作为列表元素间的边界。
set arr(index) value
替换美元标记($)以包含数组元素的值,例如:
set foo $arr(index)
例如:
set fruit(best) kiwi
=> kiwi
=> peach
=> banana
=> ok banana worst peach best kiwi
=> 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 boolean then body1 else body2
then 和 else 关键字是可选的。例如:
if {$x == 0} {
puts stderr "Divide by zero!"
} else {
set slope [expr $y/$x]
}
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 loopVar valueList commandBody
第一个参数是变量名。命令主体对循环中的每个元素运行一次,且循环变量有列表中的连续值。例如:
set numbers {1 3 5 7 11 13}
foreach num $numbers {
puts $num
}
假定环境中只存在一台服务器,上一个示例的结果将为以下输出。如果存在多台服务器,那么返回所有服务器的信息:
13 5711
13
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 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
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
proc { ... } {
global AdminConfig
... [$AdminConfig ...]
}
使用一个脚本调用其他脚本
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'
必须将正斜杠(/)用作路径分隔符。反斜杠(\)将不起作用。
eval exec ls -l > /tmp/out
Jacl 脚本编制语言的 exec 命令不完全支持重定向,因此该命令在某些平台上可能会产生问题。
使用 Jacl 语言的 exec 命令时,不要使用重定向。相反,可以将用于重定向的 exec 命令保存在一个变量中,然后将该变量写入文件,例如:
open /tmp/out w puts $fileId $result close $fileId
在某些情况下,还可以使用 shell 和 .sh 命令重定向(而不是 Tcl 发出的重定向)来执行重定向。
要获取更多有关 Jacl 的信息,请参阅脚本编制:学习资源一文
Jacl 是 TCL 的一个备用实现的更多相关文章
- 15一个NoSql数据库
随着因特网web2.0该网站的兴起.非关系型数据库,现在已经成为一个非常受欢迎的新领域.非关系数据库产品的发展非常迅速.而在处理传统的关系数据库web2.0现场.特别是大规模,高并发SNS类型web2 ...
- 为Tcl编写C的扩展库
Tcl是一个比较简洁的脚本语言,官方地址 http://www.tcl.tk. tcl脚本加载C实现的动态库非常方便. 1. 为Tcl编写一个用C实现的扩展函数. #include <stdio ...
- 简单说说Tk和Tcl
开园第一个博客,简单说说Tk和Tcl. 我接触Tk和Tcl是在学习Python Tkinter时候,创建Tk对象,下面言归正传: Tcl:工具命令语言,英文全称为Tool Command Langua ...
- Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块
Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块 最近处理的一件 linux 服务器断电导致文件系统启动后文件系统不可读写,数据不可用的案例,现总结下 Linux ...
- Tcl 简单介绍及特性
[简单介绍|特性] l 简单介绍 Tcl是一门产生于80年代末的语言,和Python一样,她是用c开发出来的.假设说C/Java/C++/C#为编译型语言的话,那么Python.Perl和Tcl就是 ...
- ExtJs006类别名、备用名
Ext.onReady(function () { //Ext.define 其他配置项 //别名.备用名 Ext.define("User", { config: { name: ...
- 关于DLL搜索路径顺序的一个问题
DLL的动态链接有两种方法.一种是加载时动态链接(Load_time dynamic linking).Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SY ...
- Tcl语言笔记之一
1,一个TCL脚本可以包含一个或多个命令.命令之间必须用换行符或分号隔开 2,置换 substitution %set y x+100 // ...
- 启动期间的内存管理之build_zonelists初始化备用内存域列表zonelists--Linux内存管理(十三)
1. 今日内容(第二阶段(二)–初始化备用内存域列表zonelists) 我们之前讲了在memblock完成之后, 内存初始化开始进入第二阶段, 第二阶段是一个漫长的过程, 它执行了一系列复杂的操作, ...
随机推荐
- [boostrap]debian下为arm创建debian和emdebian文件系统
转自:http://www.cnblogs.com/qiaoqiao2003/p/3738552.html Debian系统本身包含对arm的支持,其包含的软件包最多,但是最终的文件系统要大一些. e ...
- 日期-date.js
Date.prototype.format = function(format) { var o = { "M+" : this.getMonth() + 1, // 月 &quo ...
- 测试网站访问速度的方法(GTmetrix)
全方位的免费网站速度测试工具 — GTmetrix 它结合了Google Page Speed和Yahoo! YSlow的网页速度测试功能,并且提供可行的建议帮你改善网站速度.会根据网站的具体情况, ...
- springcloud微服务架构搭建
SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通 ...
- Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 解决办法
相信很多人都遇到过这个问题,用Android Studio正在运行程序的时候,突然不知道什么原因,报一个找不到application或者找不到activity的错误(java.lang.ClassNo ...
- iOS UIWebView 获取内容实际高度,关闭滚动效果
本文转载至 http://my.oschina.net/Khiyuan/blog/341535 iOS UIWebView 获取内容实际高度,关闭滚动效果 近期做东西,将 UIWebView 嵌套 ...
- spring基础---->spring自定义标签(一)
Spring具有一个基于架构的扩展机制,可以使用xml文件定义和配置bean.本博客将介绍如何编写自定义XML bean的解析器,并用实例来加以说明.其实我一直相信 等你出现的时候我就知道是你. Sp ...
- 动态加载script文件
动态加载script文件: http://www.cnblogs.com/skykang/archive/2011/07/21/2112685.html
- 此类目的是防治序列化Json字符串时的循环引用问题-------最好解决方案
http://james.newtonking.com/json/help/index.html using Newtonsoft.Json;using System;using System.Col ...
- 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP
[BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...