Lưu trữ trực tuyến miễn phí cho máy trạm

<Trước | Nội dung | Tiếp theo>

Logic

Như chúng ta đã khám phá ở Chương 27, (()) lệnh ghép hỗ trợ nhiều toán tử so sánh khác nhau. Có một vài điều nữa có thể được sử dụng để đánh giá logic. Đây là danh sách đầy đủ:


Bảng 34-6: Toán tử so sánh


Mô tả nhà điều hành

Mô tả nhà điều hành

<= Nhỏ hơn hoặc bằng


>= Lớn hơn hoặc bằng


< Ít hơn


> Lớn hơn



== Bằng


!= Không bằng


&& Hợp lý VÀ


|| Logic HOẶC


expr1?expr2:expr3 Toán tử so sánh (ternary). biểu thức if expr1

được đánh giá là khác 0 (số học đúng) thì expr2, khác expr3.



Khi được sử dụng cho các phép toán logic, các biểu thức tuân theo các quy tắc logic số học; nghĩa là, các biểu thức đánh giá bằng 0 được coi là sai, trong khi các biểu thức khác 0 được coi là đúng. Các (()) lệnh ghép ánh xạ kết quả vào mã thoát thông thường của shell:



[tôi @ linuxbox ~] $ nếu ((1)); sau đó echo "true"; nếu không thì echo "false"; fi

đúng

[tôi @ linuxbox ~] $ nếu ((0)); sau đó echo "true"; nếu không thì echo "false"; fi

sai

[tôi @ linuxbox ~] $ nếu ((1)); sau đó echo "true"; nếu không thì echo "false"; fi

đúng

[tôi @ linuxbox ~] $ nếu ((0)); sau đó echo "true"; nếu không thì echo "false"; fi

sai


Toán tử logic kỳ lạ nhất là toán tử bậc ba. Toán tử này (được mô phỏng theo toán tử trong ngôn ngữ lập trình C) thực hiện kiểm tra logic độc lập. Nó có thể được sử dụng như một loại câu lệnh if/then/else. Nó hoạt động trên ba biểu thức số học (chuỗi sẽ không hoạt động) và nếu biểu thức đầu tiên đúng (hoặc khác 0) thì biểu thức thứ hai sẽ được thực hiện. Nếu không, biểu thức thứ ba sẽ được thực hiện. Chúng ta có thể thử điều này trên dòng lệnh:



[tôi @ linuxbox ~] $ a = 0 [tôi @ linuxbox ~] $ ((a<1?++a:--a)) [tôi @ linuxbox ~] $ echo $ a

1

[tôi @ linuxbox ~] $ ((a<1?++a:--a))

[tôi @ linuxbox ~] $ echo $ a

0

[tôi @ linuxbox ~] $ a = 0 [tôi @ linuxbox ~] $ ((a<1?++a:--a)) [tôi @ linuxbox ~] $ echo $ a

1

[tôi @ linuxbox ~] $ ((a<1?++a:--a))

[tôi @ linuxbox ~] $ echo $ a

0


Ở đây chúng ta thấy một toán tử bậc ba đang hoạt động. Ví dụ này thực hiện chuyển đổi. Mỗi lần thực hiện toán tử, giá trị của biến a chuyển từ 0 sang 1 hoặc ngược lại.

Xin lưu ý rằng việc thực hiện phép gán trong các biểu thức không hề đơn giản.


Khi cố gắng, bash sẽ khai báo lỗi:


[tôi @ linuxbox ~] $ a = 0

[tôi @ linuxbox ~] $ ((a<1?a+=1:a-=1))

bash: ((: a<1?a+=1:a-=1: đã thử gán cho biến không biến (mã thông báo lỗi là "-=1")

[tôi @ linuxbox ~] $ a = 0

[tôi @ linuxbox ~] $ ((a<1?a+=1:a-=1))

bash: ((: a<1?a+=1:a-=1: đã thử gán cho biến không biến (mã thông báo lỗi là "-=1")


Vấn đề này có thể được giảm thiểu bằng cách đặt biểu thức gán trong dấu ngoặc đơn:



[tôi @ linuxbox ~] $ ((a<1?(a+=1):(a-=1)))

[tôi @ linuxbox ~] $ ((a<1?(a+=1):(a-=1)))


Tiếp theo, chúng ta thấy một ví dụ đầy đủ hơn về việc sử dụng các toán tử số học trong một tập lệnh tạo ra một bảng số đơn giản:



#! / bin / bash

# arith-loop: script minh họa các toán tử số học đã hoàn thành=0

a = 0

printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"


cho đến khi ((hoàn thành)); làm b=$((a**2))

c=$((a**3))

printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(kết thúc=1)))

thực hiện

#! / bin / bash

# arith-loop: script minh họa các toán tử số học đã hoàn thành=0

a = 0

printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"


cho đến khi ((hoàn thành)); làm b=$((a**2))

c=$((a**3))

printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(kết thúc=1)))

thực hiện


Trong tập lệnh này, chúng tôi triển khai vòng lặp cho đến khi dựa trên giá trị của đã kết thúc Biến đổi. Ban đầu, biến được đặt bằng 0 (số học sai) và chúng ta tiếp tục vòng lặp cho đến khi nó khác 0. Trong vòng lặp, chúng ta tính bình phương và lập phương của biến đếm

Một. Ở cuối vòng lặp, giá trị của biến đếm được ước tính. Nếu nó nhỏ hơn 10 (số lần lặp tối đa), nó sẽ tăng thêm một, nếu không, biến finish sẽ có giá trị là XNUMX, làm cho kết thúc là đúng về mặt số học, do đó kết thúc vòng lặp. Chạy script cho kết quả này:


[tôi @ linuxbox ~] $ vòng lặp số học

[tôi @ linuxbox ~] $ vòng lặp số học


a

= 0

1

2

3

4

5

6

7

8

9

10

a

= 0

1

2

3

4

5

6

7

8

9

10


a**2 a**3

==== ====

a**2 a**3

==== ====

0

1

4

9

16

25

36

49

64

81

100

0

1

4

9

16

25

36

49

64

81

100

0

1

8

27

64

125

216

343

512

729

1000

0

1

8

27

64

125

216

343

512

729

1000

Điện toán đám mây hệ điều hành hàng đầu tại OnWorks: