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 的信息,請參閱腳本編制:學習資源一文
相關文章
相關標籤/搜索