Hướng dẫn TCL TK: Ngôn ngữ lệnh công cụ

TCL là gì?

TCL là ứng dụng shell đọc lệnh TCL từ đầu vào tiêu chuẩn của nó hoặc từ một tệp và đưa ra kết quả mong muốn.

TCL là ngôn ngữ kịch bản dựa trên chuỗi và cũng là ngôn ngữ thủ tục. Nó được tạo ra lần đầu tiên bởi John Osterhout vào năm 1989. Mục đích của việc phát triển ngôn ngữ này là để dễ dàng nhúng các ứng dụng inti ( ). Ngôn ngữ này thường được sử dụng cho GUI và thử nghiệm. Ví dụ, tạo mẫu nhanh, Kiểm tra tương tác cơ sở dữ liệu, v.v. Trong TCL theo mặc định, mọi thứ đều là một chuỗi.

Trong hướng dẫn này, bạn sẽ học-

Cách thực hiện TCL

Có hai cách để thực thi mã TCL

  1. Windows ứng dụng dựa trên có sẵn ở đây tập tin exe tcltutor
  2. Ứng dụng dựa trên Linux

In Linux trình thông dịch tương tác, chúng ta có thể thực thi các tập lệnh TCL như bên dưới

Để truy cập phiên tương tác TCL, hãy thực hiện lệnh sau

Hướng dẫn TCL: Ngôn ngữ lệnh công cụ

Tập lệnh TCL

Chương trình TCL phải có phần mở rộng .tcl. Mọi tập lệnh trong UNIX/LINUX đều bắt đầu bằng đường dẫn shell TCL

#!/usr/bin/tclsh

Thí dụ:-

#!/usr/bin/tclsh
Puts "Hello World"
Script execution:-
$ chmod +x helloworld.tcl
$ ./helloworld.tcl

Đầu ra: Chào thế giới

Trong TCL, Lệnh “Puts” được sử dụng để in thông báo tới bảng điều khiển. Cú pháp của lệnh put như bên dưới

đặt?-nonewline? ?kênh ID? sợi dây

  • Không có dòng mới: Tham số tùy chọn này chặn ký tự dòng mới theo lệnh mặc định. Nó đặt một dòng mới cho mỗi chuỗi
  • Kênh ID: Thông số này dùng cho kênh đầu vào tiêu chuẩn (stdin) và kênh đầu ra tiêu chuẩn (stdout).

Bán tại:-

%puts "Hello World"
% Hello World
%puts stdout  "Hello World"
% Hello World

Loại thay thế TCL

Có ba loại thay thế trong TCL

  1. Thay thế lệnh
  2. Thay thế biến
  3. Thay thế dấu gạch chéo ngược

Chúng ta hãy nghiên cứu từng cái một

Thay thế lệnh

Dấu ngoặc vuông được sử dụng để thay thế lệnh.

Thí dụ:-

% puts [expr 1*3]
% 3

Ở đây, lệnh giữa các dấu ngoặc vuông được đánh giá trước. Kết quả được trả về . ”expr” được sử dụng để thực hiện phép tính số học.

Thay thế biến

TCL thực hiện thay thế biến với sự trợ giúp của $ ký tên.

Thí dụ:-

#!/usr/bin/tclsh
set  a  10
puts  a
puts  $a 

Ở đây chúng ta tạo một biến có tên là “a” và đặt giá trị “10” cho nó.

  • đặt a : Nó sẽ in chuỗi “a” nhưng không in giá trị của 'a' ra bàn điều khiển
  • đặt $a : Nó sẽ in giá trị của 'a' ra bàn điều khiển

Hãy thực hiện và xác minh nó. Bạn sẽ nhận được kết quả như dưới đây.

$ ./substitution.tcl

a

10

Thay thế dấu gạch chéo ngược

Trong Tcl, dấu gạch chéo ngược được sử dụng để thoát các ký tự đặc biệt cũng như để trải dài các lệnh dài trên nhiều dòng. Bất kỳ ký tự nào ngay sau dấu gạch chéo ngược sẽ đứng mà không cần thay thế. Trong ví dụ bên dưới, bạn có thể thấy ký tự đặc biệt ” “, vẫn còn sau dấu gạch chéo ngược.

Hãy xác minh điều này bằng một ví dụ

#!/usr/bin/tclsh

puts "This  is my  \"car\"

$ ./backslashsubstitution.tcl
This is my "car"

GHI CHÚ: -Để bình luận bất kỳ chuỗi nào trong TCL “#” được sử dụng. Tất cả các ký tự sau dấu “#” đều bị lệnh shell tclsh bỏ qua.

Biến TCL

Biến là một mã định danh chứa một giá trị. Nói cách khác, biến là tham chiếu đến bộ nhớ máy tính, nơi lưu trữ giá trị.

Các biến được tạo bằng “lệnh đặt” và tất cả các tên biến đều phân biệt chữ hoa chữ thường. Nó có nghĩa là xin chào, xin chào, xin chào tất cả đều khác nhau ở TCL. Hãy xem một số ví dụ về biến phân biệt chữ hoa chữ thường.

% set  name  Techoit
% set  Name  Technoit_1
% set  NAME  Technoit_2

Đầu ra: -

% puts $name
% Technoit

%puts  $Name
%Technoit_1

%puts $NAME
%Technoit_2

Tạo biến TCL

Để tạo biến trong TCL, bạn cần sử dụng "bố trí" lệnh

Đặt số 10

Để lấy giá trị của biến phải sử dụng ký hiệu “$” như

% đặt $a

% 10

Vì vậy, chúng ta nhận được giá trị của biến 'a' là 10.

Thông tin lệnh TCL tồn tại

Lệnh “set” được sử dụng để tạo và đọc các biến như được hiển thị ở trên. Lệnh unset được sử dụng để hủy một biến. Lệnh “info exists” trả về 1 nếu varName tồn tại dưới dạng một biến (hoặc một phần tử mảng) trong ngữ cảnh hiện tại, nếu không thì trả về 0. (xem ví dụ bên dưới).

Có nhiều lệnh “thông tin” khác nhau trong TCL như “thông tin tồn tại”, “chức năng thông tin”, “thông tin toàn cầu”, v.v. Ở đây chúng ta sẽ thấy một ví dụ về “thông tin tồn tại”.

Bán tại:-

% set a 20
% puts $a
% 20
% puts [info exists a]
% 1
% unset a
%puts [info exists a]
% 0

Niềng răng khác nhau và hành vi của chúng

{} -> Dấu ngoặc nhọn

Dấu ngoặc nhọn trong TCL nhóm các từ lại với nhau để trở thành đối số. Dấu ngoặc nhọn được sử dụng để xác định một khối bị trì hoãn - nói cách khác, nó có thể được chạy SAU phần còn lại của lệnh trên dòng hiện tại. Các ký tự trong dấu ngoặc nhọn được truyền tới lệnh chính xác như được viết.

Một số điểm cần nhớ

  1. Không được phép thay thế biến trong dấu ngoặc nhọn {}
  2. Nó được sử dụng để tạo kiểu dữ liệu danh sách

Thí dụ:-

% set x 10
% puts {$x}
% $x

%set number {1 2 3 4 5} -> Số ở đây là kiểu dữ liệu danh sách

% đặt số $

% 1 2 3 4 5

[] -> dấu ngoặc vuông

Dấu ngoặc vuông được sử dụng để tạo lệnh lồng nhau. Nói một cách đơn giản, đầu ra của một lệnh được truyền dưới dạng tham số cho lệnh khác. Dấu ngoặc vuông được sử dụng để xác định một khối chạy TRƯỚC phần còn lại của lệnh trên dòng hiện tại và kết quả được thay thế vào dòng đó.

Bán tại: -

% set x 10
% puts "y : [set y [set x 10]]"
%y : 10
% puts "x : $x"
%x : 10

() -> niềng răng tròn

Lệnh này được sử dụng để tạo kiểu dữ liệu mảng và cũng cho biết mức độ ưu tiên của toán tử.

% set a(1) 10
% set a(2) 20

Ở đây “a” là một mảng có giá trị 10 và 20. Xem các lệnh bên dưới để in các khóa, cặp giá trị khóa và giá trị của mảng.

% 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

Để in giá trị “Nth” của mảng a, chúng ta sẽ sử dụng Puts $a(N)

Đối số dòng lệnh TCL

Các mục dữ liệu được truyền đến tập lệnh từ dòng lệnh được gọi là đối số. Số lượng đối số dòng lệnh cho tập lệnh Tcl được truyền dưới dạng biến toàn cục argc . Tên của tập lệnh Tcl được truyền cho tập lệnh dưới dạng biến toàn cục argv0 và phần còn lại của các đối số dòng lệnh được chuyển dưới dạng danh sách trong argv.

TCL có 3 biến được xác định trước như

$argc   -> indicates the number of arguments passed to the script

$argv   -> indicates list of arguments

$argv0  -> indicates the name of script

Bán tại:-

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

đầu ra:-

  • Số lượng đối số được truyền cho tập lệnh: 3
  • Danh sách các đối số được truyền vào tập lệnh: 10 20 30
  • Tên của tập lệnh là: arg-script.tcl

Biểu thức TCL và Operator

Biểu thức được xây dựng từ các toán hạng và toán tử. Nó được đánh giá bằng lệnh "expr". Operators được đánh giá dựa trên mức độ ưu tiên và tính kết hợp. Ngôn ngữ TCL có các toán tử tích hợp như sau

Operadanh mục tor Ưu tiên/Kết hợp
toán học Operator + - * / % Từ trái sang phải
Quan hệ Operator == != < > <= >= Trái sang Phải
logic Operator && || ! Trái sang Phải
Bitwise Operator & | ^ ~ Trái sang Phải
Đệ tam Operator ?: Phải sang trái
Shift Operator << >> Trái sang Phải
So sánh chuỗi Operator tương đương Trái sang Phải
Phép tính Operator ** Trái sang Phải
Danh sách Operator trong ni Trái sang Phải

toán học Operator

Biểu thức TCL bao gồm sự kết hợp của toán hạng, toán tử và dấu ngoặc đơn. Hãy xem ví dụ về toán tử số học trong TCL

+ Thêm hai hoặc nhiều toán hạng

Bán tại:-

%set a 10 
%set b 20
%puts [expr $a + $b]
30

- Trừ hai hoặc nhiều toán hạng

Bán tại:-

%set a 20 
%set b 10
%puts [expr $a - $b]
10

* Nhân hai hoặc nhiều toán hạng

%set a 20 
%set b 10
%puts [expr $a * $b]
200

/ Chia tử số cho tử số

%set a 20 
%set b 10
%puts [expr $a / $b]
2

Toán tử % mô đun chia tử số cho số khử nhưng trả về lời nhắc

%set a 20 
%set b 10
%puts [expr $a % $b]
0

Quan hệ Operator

Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không. Nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0.

%set a 20 
%set b 10
%puts [expr $a > $b]
1

Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không. Nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0

%set a 10 
%set b 20
%puts [expr $a < $b]
1

>= Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành đúng và trả về 1 nếu không trả về 0

%set a 20 
%set b 10
%puts [expr $a >= $b]
1

<= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành đúng và trả về 1, ngược lại trả về 0

%set a 20 
%set b 10
%puts [expr $a <= $b]
0

!= Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu giá trị không bằng thì điều kiện trở thành true và trả về 1, ngược lại trả về 0

%set a 20 
%set b 10
%puts [expr $a != $b]
1

== Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành đúng và trả về 1 nếu không trả về 0

%set a 20 
%set b 10
%puts [expr $a == $b]
0

logic Operator

&& Nếu cả hai toán hạng đều khác 1 thì điều kiện trở thành đúng và trả về 0, ngược lại trả về XNUMX

%set a 20 
%set b 10
%puts [expr $a && $b]
1

|| Nếu bất kỳ toán hạng nào trong hai toán hạng khác 1 thì điều kiện trở thành đúng và trả về 0, ngược lại trả về XNUMX

%set a 0 
%set b 10
%puts [expr $a || $b]
1

! Được sử dụng để đảo ngược kết quả của bất kỳ biểu thức nào. Ở đây, trong kết quả đầu ra, bạn có thể thấy giá trị của 'a' hiện đã trở thành 1 từ 0. Trong khi giá trị của 'b' đã trở thành 0 từ 1.

%set a 0 
%set b 1
%puts [expr !$a]
1
%puts [expr !$b]
0

Bitwise Operator

& (bitwise and) thực hiện thao tác từng bit và tuân theo bảng bên dưới để thực hiện thao tác.

A B A & B
0 0 0
0 1 0
1 1 1
1 0 0

Bán tại:-

%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 

| (bitwise or) thực hiện thao tác từng bit và làm theo bảng bên dưới

A B Một | b
0 0 0
0 1 1
1 1 1
1 0 1

Bán tại:-

%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 

^ (loại trừ bit hoặc) thực hiện thao tác từng bit và làm theo bảng bên dưới

A B A ^ B
0 0 0
0 1 1
1 1 0
1 0 1

Bán tại:-

%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

~ (phủ định bit) toán tử thay đổi mỗi 1 thành 0 và 0 thành 1, theo bảng tham chiếu

A ~A
0 1
1 0
%set A 7
%puts [expr ~$A]
-8

Đệ tam Operator ( ? :)

Cú pháp là

condition-expression?  expression_1: expression_2

Nếu điều kiện-exp đúng, exp1 được đánh giá và kết quả được trả về. Nếu cond-exp sai, exp2 sẽ được đánh giá và kết quả của nó sẽ được trả về. Trong ví dụ của chúng tôi, exp1 đúng khi giá trị của A lớn hơn 6.

%set A 7
%set result [expr $A > 6 ? true : false]
%puts $result
true

Shift Operator

Shift toán tử được biểu thị bằng toán tử dịch chuyển trái << hoặc toán tử dịch chuyển phải >>. Đối với toán tử dịch chuyển trái <<, giá trị toán hạng trái được dịch chuyển sang trái theo số bit được chỉ định bởi toán hạng phải.

%set A 7
%set result [expr $A << 2]
%puts $result

Đối với toán tử dịch chuyển >>, giá trị toán hạng bên trái được di chuyển sang phải theo số bit được chỉ định bởi toán hạng bên phải.

%set A 7
%set result [expr $A >> 2]
%puts $result

So sánh chuỗi Operator

Toán tử so sánh chuỗi so sánh giá trị của cả hai toán hạng. Nếu giá trị của toán hạng giống nhau, thì nó sẽ trả về 1, nếu không thì trả về 0. Trong ví dụ, giá trị cho cả A và B là 7, do đó kết quả trả về 1.

Bán tại:-

%set A 7 
%set B 7
%set result [expr $A eq $B]
%puts $result
1

Ne (nếu giá trị của cả hai toán hạng khác nhau thì nó sẽ trả về 1, nếu không thì trả về 0)

%set A 7 
%set B 8
%set result [expr $A ne $B]
%puts $result
1

Toán tử lũy thừa

Pow() và ** đều giống nhau. Nó luôn trả về giá trị nổi.

** cho biết sức mạnh của toán hạng mong muốn.

Bán tại:-

%set A 7
%set result [expr $A ** 2]
%puts $result
49

Danh sách Operator

Nếu giá trị bắt buộc được tìm thấy trong danh sách đã xác định, nó sẽ trả về 1, nếu không thì trả về 0. Trong ví dụ, giá trị 1 tồn tại trong biến 'a' do đó nó sẽ trả về 1.

set a {1 2 3}
if {1 in $a} {
puts "ok"
} else {
puts "fail"
}
Output: ok

ni, nếu giá trị bắt buộc được tìm thấy trong danh sách đã xác định thì nó sẽ trả về 0, nếu không thì trả về 1.

Bán tại :-

set a {1 2 3}
if {1 ni $a} {
puts "ok"
} else {
puts "fail"
}
Output: fail

Kiểm soát luồng TCL và ra quyết định

Có nhiều lệnh điều khiển luồng và ra quyết định khác nhau được sử dụng để thay đổi luồng của chương trình. Việc thực thi chương trình luôn bắt đầu từ đầu tệp nguồn đến cuối tệp.

Câu lệnh if bao gồm biểu thức Boolean theo sau là một hoặc nhiều câu lệnh.

Nếu ... câu lệnh

Cú pháp: -

nếu expr thì? thân hình

nếu expr được đánh giá là true thì phần thân lệnh sẽ được thực thi.

Bán tại:-

set age 10

if {$age < 20} {
puts "Age is less than 20"
}

Output: Age is less than 20

Câu lệnh if ... else

Cú pháp: -

Nếu biểu hiện? sau đó là body_1 còn lại là body_2

Nếu biểu thức được đánh giá là đúng thì nó sẽ trả về body_1 nếu không nó sẽ trả về body_2

Bán tại:--

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

Câu lệnh if..else lồng nhau

Nó có nghĩa là một câu lệnh if hoặc else..if có thể được đặt bên trong một câu lệnh if hoặc else..if khác.

Cú pháp: -

If  {expression_1} {
Body_1
If {expression_2} {
Body_2
}
}

Bán tại:--

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

Chuyển đổi câu lệnh

Câu lệnh switch cho phép kiểm tra sự bằng nhau của một biến so với danh sách các giá trị. Nó đánh giá danh sách các giá trị và trả về kết quả của đánh giá đó. Nếu không có giá trị nào khớp thì giá trị mặc định sẽ được trả về.

Ví dụ:

#!/usr/bin/tclsh

# switch_cmd.tcl

set domain x
switch $domain {

    x { puts "x" }
    y { puts "y" }
    z { puts "z" }
    default { puts "unknown" }
}

Công tắc lồng nhau

Câu lệnh switch lồng nhau có nghĩa là câu lệnh switch bên trong câu lệnh switch.

cú pháp :-

switch <switchingstring1> {
   <matchstring1> {
      body1
      switch <switchingstring2> {
        <matchstring2> {
           body2
         }
          ...
    switch <switchingstringN> {
          <matchStringN> {
           bodyN
         }
      }
   }

Ví dụ: Trong ví dụ sau, giá trị của a là 100 và với cùng đoạn mã trên, chúng ta chuyển câu lệnh sang giá trị khác của b là 200. Lệnh out sẽ hiển thị giá trị cho cả a và 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"
        }
     }
   }   
}

Đầu ra: -

Giá trị của a là 100

Giá trị của b là 200

Câu lệnh vòng lặp TCL

Câu lệnh lặp cho phép thực hiện một câu lệnh hoặc nhóm câu lệnh nhiều lần. Tcl cung cấp các loại câu lệnh lặp sau.

Lệnh trong khi

Khi một điều kiện nhất định là đúng thì một câu lệnh hoặc một nhóm câu lệnh sẽ lặp lại trong thân vòng lặp.

cú pháp:

While  {condition} {
    Statements
}

Bán tại :-

#!/usr/bin/tclsh

Set a 10

While {$a < 12} {
    Puts "a is $a"
    incr a
}

Đầu ra: -

a là 10

a là 11

Trong ví dụ trên, lệnh tích hợp "incr" được sử dụng. Điều đó có nghĩa là giá trị của 'a' sẽ tăng thêm 1 cho đến giá trị tối đa (<12).

Đối với lệnh

Nó thực thi một chuỗi các câu lệnh nhiều lần dựa trên một giá trị bộ đếm. Nó được tự động tăng hoặc giảm trong mỗi lần lặp lại vòng lặp.

cú pháp :-

For {start} {test} {next} {
Body
}

Ví dụ: Trong ví dụ bên dưới, giá trị 'i' được đặt thành 0 và tăng dần cho đến khi giá trị <5.

#!/usr/bin/tclsh

for {set i 0} {$i < 5} {incr i} {
put $i
}

Đầu ra: -

0 
1 
2 
3 
4

Tóm tắt:

  • TCL là ngôn ngữ kịch bản dựa trên chuỗi và cũng là ngôn ngữ thủ tục
  • Ngôn ngữ này thường được sử dụng cho GUI và thử nghiệm
  • Trong TCL theo mặc định mọi thứ đều là chuỗi
  • TCL là ứng dụng shell đọc lệnh TCL từ đầu vào tiêu chuẩn của nó hoặc từ một tệp và đưa ra kết quả mong muốn.
  • Chương trình TCL nên có phần mở rộng .tcl