TCL TK チュートリアル: ツール コマンド言語
TCLとは何ですか?
TCL は、標準入力またはファイルから TCL コマンドを読み取り、必要な結果を与えるシェル アプリケーションです。
TCL は文字列ベースのスクリプト言語であり、手続き型言語でもあります。 この言語は、1989 年に John Osterhout によって初めて作成されました。この言語を開発した目的は、簡単に埋め込まれた inti () アプリケーションです。 この言語は、GUI とテストによく使用されます。 たとえば、ラピッドプロトタイピング、 テスト データベースの対話など。TCL ではデフォルトですべてが文字列です。
このチュートリアルでは、次のことを学びます。
TCLの実行方法
TCL コードを実行するには XNUMX つの方法があります
- Windows ベースのアプリケーションはここから入手できます tcltutor exeファイル
- Linuxベースのアプリケーション
In Linux 対話型インタープリターでは、以下のように TCL スクリプトを実行できます。
TCL対話型セッションにアクセスするには、次のコマンドを実行します。
TCLスクリプト
TCL プログラムには .tcl 拡張子が必要です。 UNIX/LINUX のすべてのスクリプトは TCL シェル パスで始まります
#!/usr/bin/tclsh
例:-
#!/usr/bin/tclsh Puts "Hello World" Script execution:- $ chmod +x helloworld.tcl $ ./helloworld.tcl
出力: こんにちは世界
TCL では、コンソールにメッセージを出力するために「Puts」コマンドが使用されます。puts の構文は次のとおりです。
を入れますか?-改行はありません? ?チャンネルID? 弦
- 改行なし: このオプションのパラメーターは、デフォルトのコマンドで改行文字を抑制します。 各文字列に改行を入れます
- チャンネルID: このパラメータは標準入力チャンネル (stdin) と標準出力チャンネル (stdout) に使用されます。
元:-
%puts "Hello World" % Hello World %puts stdout "Hello World" % Hello World
TCL置換タイプ
TCLにはXNUMX種類の置換があります
- コマンド置換
- 変数置換
- バックスラッシュの置換
一つ一つ勉強していきましょう
コマンド置換
角括弧はコマンドの置換に使用されます。
例:-
% puts [expr 1*3] % 3
ここでは、角括弧内のコマンドが最初に評価されます。結果は、算術計算を実行するために使用される「expr」として返されます。
変数置換
TCL は、次の助けを借りて変数置換を実行します。 $ 符号。
例:-
#!/usr/bin/tclsh set a 10 puts a puts $a
ここでは、「a」という変数を作成し、値「10」を設定します。
- put a : 文字列「a」をコンソールに出力しますが、「a」の値は出力しません
- put $a : 'a' の値をコンソールに出力します
実行して確認してみましょう。 以下のような出力が得られます。
$ ./substitution.tcl
a
10
バックスラッシュの置換
Tcl では、バックスラッシュは特殊文字をエスケープするため、および長いコマンドを複数行にまたがって記述するために使用されます。バックスラッシュの直後の文字は置換されずにそのまま残ります。以下の例では、特殊文字「」がバックスラッシュの後に残っていることがわかります。
これを例で検証してみましょう
#!/usr/bin/tclsh puts "This is my \"car\" $ ./backslashsubstitution.tcl This is my "car"
ノート: -TCL 内の任意の文字列をコメントするには「#」が使用されます。 「#」以降の文字はすべて、tclsh シェル コマンドによって無視されます。
TCL変数
変数とは、値を保持する識別子です。 言い換えれば、変数は値が保存されるコンピュータ メモリへの参照です。
変数は「set コマンド」によって作成され、すべての変数名は大文字と小文字が区別されます。 つまり、TCL では Hello、Hello、HELLO はすべて異なります。 大文字と小文字を区別する変数の例を見てください。
% set name Techoit % set Name Technoit_1 % set NAME Technoit_2
出力:-
% puts $name % Technoit %puts $Name %Technoit_1 %puts $NAME %Technoit_2
TCL変数の作成
TCL で変数を作成するには、次を使用する必要があります。 "セットする" command
10を設定します
変数の値を取得するには、次のように「$」記号を使用する必要があります
% $a を入れる
10%
したがって、変数「a」の値は 10 として取得されます。
TCLコマンド情報が存在します
「set」コマンドは、上記のように変数の作成と読み取りに使用します。unset コマンドは、変数を破棄するために使用されます。「info exists」コマンドは、varName が現在のコンテキストに変数 (または配列要素) として存在する場合は 1 を返し、それ以外の場合は 0 を返します (以下の例を参照)。
TCL には、「info 存在」、「info 関数」、「info global」など、さまざまな「info」コマンドがあります。 ここでは「情報が存在する」の例を見てみましょう。
元:-
% set a 20 % puts $a % 20 % puts [info exists a] % 1 % unset a %puts [info exists a] % 0
さまざまな中括弧とその動作
{} -> 中括弧
TCL の中括弧は単語をグループ化して引数とします。 中括弧は、遅延されるブロックを定義するために使用されます。つまり、現在の行のコマンドの残りの部分の後で実行される可能性があります。 中括弧内の文字は、記述されたとおりにコマンドに渡されます。
覚えておくべきいくつかのポイント
- {} 中括弧内では変数置換は許可されません
- リストデータ型の作成に使用されます
例:-
% set x 10 % puts {$x} % $x
%set number {1 2 3 4 5} -> ここで、number はリスト データ型です。
%puts $number
%1 2 3 4 5
[] -> 角中括弧
角括弧はネストされたコマンドを作成するために使用されます。簡単に言うと、1 つのコマンドの出力が別のコマンドに引数として渡されます。角括弧は、現在の行の残りのコマンドの前に実行されるブロックを定義するために使用され、その結果が行に代入されます。
元: -
% set x 10 % puts "y : [set y [set x 10]]" %y : 10 % puts "x : $x" %x : 10
() -> 丸括弧
このコマンドは、配列データ型を作成し、演算子の優先順位を示すために使用されます。
% set a(1) 10 % set a(2) 20
ここで、「a」は値 10 と 20 を持つ配列です。キー、キー値のペア、および配列の値を出力するには、以下のコマンドを参照してください。
% puts [array get a] -> To print key value pairs we use this command % 1 10 2 20 % puts [array names a] -> To print only keys % 1 2 % puts $a(1) -> To print first value of array % 10 % puts $a(2) -> To print second value of array % 20
配列 a の「N 番目」の値を出力するには、Puts $a(N) を使用します。
TCL コマンドライン引数
コマンドラインからスクリプトに渡されるデータ項目は引数と呼ばれます。 Tcl スクリプトへのコマンド ライン引数の数はグローバル変数として渡されます。 argc 。 Tcl スクリプトの名前は、グローバル変数としてスクリプトに渡されます。 argv0 、残りのコマンドライン引数はリストとして渡されます。 引数.
TCL には、次の 3 つの事前定義変数があります。
$argc -> indicates the number of arguments passed to the script $argv -> indicates list of arguments $argv0 -> indicates the name of script
元:-
arg-script.tcl #!/usr/bin/tclsh< puts "number of arguments passed to the scripts : $argc" puts "list of arguments are passed to the script: $argv" puts "the name of scripts is: $argv0"
$ ./arg-script.tcl 10 20 30
出力:-
- スクリプトに渡される引数の数: 3
- スクリプトに渡される引数のリスト: 10 20 30
- スクリプトの名前は : arg-script.tcl
TCL 式と Operaタ
式はオペランドと演算子から構成されます。これは「expr」コマンドで評価されます。 Opera演算子は優先順位と結合性に基づいて評価されます。TCL言語には以下のような組み込み演算子があります。
Operaカテゴリー | シンボル | 優先順位/結合性 |
---|---|---|
算術 Operaタ | + - * / % | 左から右へ |
リレーショナル Operaタ | == != < > <= >= | 左から右へ |
論理的 Operaタ | && || ! | 左から右へ |
ビット単位 Operaタ | & | ^ ~ | 左から右へ |
ターナリー Operaタ | ?: | 右から左へ |
Shift Operaタ | << >> | 左から右へ |
文字列の比較 Operaタ | 等式 | 左から右へ |
累乗 Operaタ | ** | 左から右へ |
リスト Operaタ | に | 左から右へ |
算術 Operaタ
TCL式は、オペランド、演算子、括弧の組み合わせで構成されます。TCLの算術演算子の例を見てみましょう。
+ 2つ以上のオペランドを加算する
元:-
%set a 10 %set b 20 %puts [expr $a + $b] 30
- 2つ以上のオペランドを減算します
元:-
%set a 20 %set b 10 %puts [expr $a - $b] 10
*2つ以上のオペランドを乗算する
%set a 20 %set b 10 %puts [expr $a * $b] 200
/ 分子を分母で割る
%set a 20 %set b 10 %puts [expr $a / $b] 2
% 剰余演算子は分子を減分子で割りますが、余りを返します
%set a 20 %set b 10 %puts [expr $a % $b] 0
リレーショナル Operaタ
左のオペランドの値が右のオペランドの値より大きいかどうかを確認します。大きい場合は条件が真となり、1 を返し、そうでない場合は 0 を返します。
%set a 20 %set b 10 %puts [expr $a > $b] 1
左オペランドの値が右オペランドの値より小さいかどうかを確認します。小さい場合は条件が真となり、1 を返し、そうでない場合は 0 を返します。
%set a 10 %set b 20 %puts [expr $a < $b] 1
>= 左オペランドの値が右オペランドの値以上かどうかをチェックし、そうであれば条件が真となり 1 を返し、そうでない場合は 0 を返します。
%set a 20 %set b 10 %puts [expr $a >= $b] 1
<= 左オペランドの値が右オペランドの値以下かどうかをチェックし、そうであれば条件が真となり 1 を返し、そうでない場合は 0 を返します。
%set a 20 %set b 10 %puts [expr $a <= $b] 0
!= 1 つのオペランドの値が等しいかどうかをチェックします。値が等しくない場合は条件が真となり 0 を返し、そうでない場合は XNUMX を返します。
%set a 20 %set b 10 %puts [expr $a != $b] 1
== 1 つのオペランドの値が等しいかどうかをチェックします。等しい場合は条件が真となり 0 を返し、そうでない場合は XNUMX を返します。
%set a 20 %set b 10 %puts [expr $a == $b] 0
論理的 Operaタ
&& 両方のオペランドがゼロでない場合、条件は真となり 1 を返し、そうでない場合は 0 を返します。
%set a 20 %set b 10 %puts [expr $a && $b] 1
|| 1つのオペランドのいずれかがゼロでない場合、条件が真となり0を返し、そうでない場合はXNUMXを返します。
%set a 0 %set b 10 %puts [expr $a || $b] 1
! 任意の式の結果を反転するために使用されます。 ここの出力では、「a」の値が 1 から 0 になっていることがわかります。一方、「b」の値は 0 から 1 になっています。
%set a 0 %set b 1 %puts [expr !$a] 1 %puts [expr !$b] 0
ビット単位 Operaタ
& (ビット単位の論理積) はビットごとに演算を実行し、演算については以下の表に従います。
A | B | A&B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
元:-
%set A 10 %set B 20 Follow the sequence to convert decimal to binary number 128 64 32 16 8 4 2 1 10 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 0 1 0 1 0 20 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 1 0 1 0 0 So now as per above tabular rules A & B will be 0 0 0 0 0 0 0 0
| (ビット単位のOR) ビットごとに演算を実行し、以下の表に従います。
A | B | あ | B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
元:-
%set A 10 %set B 20 Follow the sequence to convert decimal to binary number 128 64 32 16 8 4 2 1 10 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 0 1 0 1 0 20 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 1 0 1 0 0 So now as per above tabular rules A | B will be 0 0 0 1 1 1 1 0
^ (ビットごとの排他的論理和) ビットごとに演算を実行し、以下の表に従います。
A | B | A^B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
元:-
%set A 10 %set B 20 Follow the sequence to convert decimal to binary number 128 64 32 16 8 4 2 1 10 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 0 1 0 1 0 20 binary equivalents will be 128 64 32 16 8 4 2 1 à 0 0 0 1 0 1 0 0 So now as per above tabular rules A ^ B will be 0 0 0 1 1 1 1 0 à 30
~ (ビット否定) 演算子は、1 を 0 に、0 を 1 に変更します。表を参考にしてください。
A | ~A |
---|---|
0 | 1 |
1 | 0 |
%set A 7 %puts [expr ~$A] -8
ターナリー Operaトール ( ?:)
構文は
condition-expression? expression_1: expression_2
condition-exp が true の場合、exp1 が評価され、結果が返されます。 cond-exp が false の場合、exp2 が評価され、その結果が返されます。 この例では、A の値が 1 より大きいため、exp6 は true になります。
%set A 7 %set result [expr $A > 6 ? true : false] %puts $result true
Shift Operaタ
Shift 演算子は、<< 左シフト演算子、または >> 右シフト演算子のいずれかで示されます。<< 左シフト演算子の場合、左オペランドの値は、右オペランドで指定されたビット数だけ左に移動します。
%set A 7 %set result [expr $A << 2] %puts $result
>> 右シフト演算子の場合、左オペランドの値は右オペランドで指定されたビット数だけ右に移動します。
%set A 7 %set result [expr $A >> 2] %puts $result
文字列の比較 Operaタ
文字列比較演算子は、両方のオペランドの値を比較します。オペランドの値が同じ場合は 1 を返し、そうでない場合は 0 を返します。例では、A と B の両方の値が 7 なので、結果は 1 を返します。
元:-
%set A 7 %set B 7 %set result [expr $A eq $B] %puts $result 1
Ne (両方のオペランドの値が異なる場合は 1 を返し、そうでない場合は 0 を返します)
%set A 7 %set B 8 %set result [expr $A ne $B] %puts $result 1
指数演算子
Pow() と ** はどちらも同じです。 常に浮動小数点値を返します。
** は目的のオペランドの累乗を示します。
元:-
%set A 7 %set result [expr $A ** 2] %puts $result 49
リスト Operaタ
必要な値が定義されたリスト内で見つかった場合は 1 を返し、それ以外の場合は 0 を返します。この例では、値 1 が変数 'a' に存在するため、1 を返します。
set a {1 2 3} if {1 in $a} { puts "ok" } else { puts "fail" } Output: ok
ni、必要な値が定義されたリスト内で見つかった場合は 0 を返し、それ以外の場合は 1 を返します。
元 :-
set a {1 2 3} if {1 ni $a} { puts "ok" } else { puts "fail" } Output: fail
TCL のフロー制御と意思決定
プログラムの流れを変更するために使用されるさまざまなフロー制御および意思決定コマンドがあります。 プログラムの実行は常にソース ファイルの先頭から最後まで始まります。
If ステートメントは、ブール式とそれに続く XNUMX つ以上のステートメントで構成されます。
If ... ステートメント
構文:-
if expr ?then? 体
expr が true と評価された場合、コマンドの本体が実行されます。
元:-
set age 10 if {$age < 20} { puts "Age is less than 20" } Output: Age is less than 20
If ...else ステートメント
構文 :-
if 式 ? 次に body_1、それ以外の場合 body_2
式が true と評価された場合、body_1 が返され、それ以外の場合は body_2 が返されます。
元: -
set age 10 if {$age < 20} { puts "Age is less than 20" } else { Puts "Age is greater than 20" } output: Age is less than 20
ネストされた if..else ステートメント
これは、ある if または else..if ステートメントを別の if または else..if ステートメントの中に入れることができることを意味します。
構文:-
If {expression_1} { Body_1 If {expression_2} { Body_2 } }
元: -
set a 10 set b 20 if {$a == 10} { # if expression_1 is true then it will go to expression_2 if {$b == 20} { #if expression_2 is true then it will print the below string puts "value of a is 10 and b is 20" } } o/p: value of a is 10 and b is 20
スイッチステートメント
switch ステートメントを使用すると、値のリストに対して変数が等しいかどうかをテストできます。 値のリストを評価し、その評価の結果を返します。 一致する値がない場合は、デフォルト値が返されます。
例:
#!/usr/bin/tclsh # switch_cmd.tcl set domain x switch $domain { x { puts "x" } y { puts "y" } z { puts "z" } default { puts "unknown" } }
ネストされたスイッチ
ネストされた switch ステートメントは、switch ステートメント内の switch ステートメントを意味します。
構文 :-
switch <switchingstring1> { <matchstring1> { body1 switch <switchingstring2> { <matchstring2> { body2 } ... switch <switchingstringN> { <matchStringN> { bodyN } } }
例: 次の例では、a の値は 100 で、同じコードで switch ステートメントを実行すると、b の値は 200 になります。out には、a と b の両方の値が表示されます。
#!/usr/bin/tclsh set a 100 set b 200 switch $a { 100 { puts "The value of a is $a" switch $b { 200 { puts "The value of b is $b" } } } }
出力:-
aの値は100です
bの値は200です
TCL ループ ステートメント
ループ ステートメントを使用すると、ステートメントまたはステートメントのグループを複数回実行できます。Tcl では、次の種類のループ ステートメントが提供されます。
コマンド中
指定された条件が true の場合、ループ本体内のステートメントまたはステートメントのグループが繰り返されます。
構文:
While {condition} { Statements }
元 :-
#!/usr/bin/tclsh Set a 10 While {$a < 12} { Puts "a is $a" incr a }
出力:-
aは10です
aは11です
上記の例では、組み込みコマンド「incr」を使用しています。 これは、「a」の値が最大値 (<1) になるまで 12 ずつ増加することを意味します。
コマンド用
カウンタ値に基づいて一連のステートメントを複数回実行します。 ループの繰り返し中に自動的に増加または減少します。
構文 :-
For {start} {test} {next} { Body }
例: 以下の例では、「i」の値は 0 に設定され、値が 5 未満になるまで増分されます。
#!/usr/bin/tclsh for {set i 0} {$i < 5} {incr i} { put $i }
出力:-
0 1 2 3 4
概要
- TCL は文字列ベースのスクリプト言語であり、手続き型言語でもあります。
- この言語は GUI とテストによく使用されます
- TCL ではデフォルトですべてが文字列です
- TCL は、標準入力またはファイルから TCL コマンドを読み取り、必要な結果を与えるシェル アプリケーションです。
- TCL プログラムには .tcl 拡張子が必要です