<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
<Trước | Nội dung | Tiếp theo>