TCL TK チュートリアル: ツール コマンド言語

TCLとは何ですか?

TCL は、標準入力またはファイルから TCL コマンドを読み取り、必要な結果を与えるシェル アプリケーションです。

TCL は文字列ベースのスクリプト言語であり、手続き型言語でもあります。 この言語は、1989 年に John Osterhout によって初めて作成されました。この言語を開発した目的は、簡単に埋め込まれた inti () アプリケーションです。 この言語は、GUI とテストによく使用されます。 たとえば、ラピッドプロトタイピング、 テスト データベースの対話など。TCL ではデフォルトですべてが文字列です。

このチュートリアルでは、次のことを学びます。

TCLの実行方法

TCL コードを実行するには XNUMX つの方法があります

  1. Windows ベースのアプリケーションはここから入手できます tcltutor exeファイル
  2. Linuxベースのアプリケーション

In Linux 対話型インタープリターでは、以下のように TCL スクリプトを実行できます。

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種類の置換があります

  1. コマンド置換
  2. 変数置換
  3. バックスラッシュの置換

一つ一つ勉強していきましょう

コマンド置換

角括弧はコマンドの置換に使用されます。

例:-

% 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 の中括弧は単語をグループ化して引数とします。 中括弧は、遅延されるブロックを定義するために使用されます。つまり、現在の行のコマンドの残りの部分の後で実行される可能性があります。 中括弧内の文字は、記述されたとおりにコマンドに渡されます。

覚えておくべきいくつかのポイント

  1. {} 中括弧内では変数置換は許可されません
  2. リストデータ型の作成に使用されます

例:-

% 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 拡張子が必要です