OnWorks Linux và Windows Online WorkStations

Logo

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

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

Kết hợp các biểu thức

Cũng có thể kết hợp các biểu thức để tạo ra các đánh giá phức tạp hơn. Các Expres- sions được kết hợp bằng cách sử dụng các toán tử logic. Chúng tôi đã thấy những điều này trong Chương 17, khi chúng tôi biết về tìm chỉ huy. Có ba phép toán logic cho thử nghiệm [[]]. Chúng là VÀ, HOẶC và KHÔNG. thử nghiệm [[]] sử dụng các toán tử khác nhau để gửi lại các hoạt động này:


Bảng 27-4: Các toán tử lôgic


hoạt động test [[]] và (())

hoạt động test [[]] và (())

-Một &&


hình ảnh

OR -o||


hình ảnh

KHÔNG ! !


hình ảnh


Đây là một ví dụ về phép toán AND. Tập lệnh sau xác định xem một số nguyên có nằm trong một phạm vi giá trị hay không:



#! / bin / bash


# test-integer3: xác định xem một số nguyên có nằm trong một

# phạm vi giá trị được chỉ định.


MIN_VAL = 1 MAX_VAL = 100


INT = 50

#! / bin / bash


# test-integer3: xác định xem một số nguyên có nằm trong một

# phạm vi giá trị được chỉ định.


MIN_VAL = 1 MAX_VAL = 100


INT = 50



if [["$ INT" = ~ ^ -? [0-9] + $]]; sau đó

nếu [[INT -ge MIN_VAL && INT -le MAX_VAL]]; sau đó echo "$ INT nằm trong khoảng từ $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm ngoài phạm vi."

fi khác

echo "INT không phải là số nguyên." > & 2 lối ra 1

fi


if [["$ INT" = ~ ^ -? [0-9] + $]]; sau đó

nếu [[INT -ge MIN_VAL && INT -le MAX_VAL]]; sau đó echo "$ INT nằm trong khoảng từ $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm ngoài phạm vi."

fi khác

echo "INT không phải là số nguyên." > & 2 lối ra 1

fi


Trong tập lệnh này, chúng tôi xác định xem giá trị của số nguyên INT nằm giữa các giá trị của MIN_VAL MAX_VAL. Điều này được thực hiện bởi một lần sử dụng [[]], bao gồm hai biểu thức được phân tách bằng dấu && nhà điều hành. Chúng tôi cũng có thể mã hóa điều này bằng cách sử dụng thử nghiệm:


if [ $ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL ]; sau đó echo "$ INT nằm trong khoảng từ $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm ngoài phạm vi."

fi

if [ $ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL ]; sau đó echo "$ INT nằm trong khoảng từ $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm ngoài phạm vi."

fi


! toán tử phủ định đảo ngược kết quả của một biểu thức. Nó trả về true nếu một ngoại lệ là false và trả về false nếu một biểu thức là true. Trong đoạn mã sau, chúng tôi sửa đổi logic đánh giá của mình để tìm các giá trị của INT nằm ngoài phạm vi được chỉ định:



#! / bin / bash


# test-integer4: xác định xem một số nguyên có nằm ngoài một

# phạm vi giá trị được chỉ định.


MIN_VAL = 1 MAX_VAL = 100


INT = 50


if [["$ INT" = ~ ^ -? [0-9] + $]]; sau đó

nếu như [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL)]]; sau đó echo "$ INT nằm ngoài $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm trong phạm vi."

#! / bin / bash


# test-integer4: xác định xem một số nguyên có nằm ngoài một

# phạm vi giá trị được chỉ định.


MIN_VAL = 1 MAX_VAL = 100


INT = 50


if [["$ INT" = ~ ^ -? [0-9] + $]]; sau đó

nếu như [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL)]]; sau đó echo "$ INT nằm ngoài $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm trong phạm vi."



echo "INT không phải là số nguyên." > & 2 lối ra 1

fi


echo "INT không phải là số nguyên." > & 2 lối ra 1

fi

Chúng tôi cũng bao gồm các dấu ngoặc đơn xung quanh biểu thức, để nhóm. Nếu những điều này không được đề cập, thì sự phủ định sẽ chỉ áp dụng cho biểu thức đầu tiên chứ không phải sự kết hợp của cả hai. Mã hóa cái này bằng thử nghiệm sẽ được thực hiện theo cách này:


nếu như [ ! \ ($ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL \)]; sau đó echo "$ INT nằm ngoài $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm trong phạm vi."

fi

nếu như [ ! \ ($ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL \)]; sau đó echo "$ INT nằm ngoài $ MIN_VAL đến $ MAX_VAL."

khác

echo "$ INT nằm trong phạm vi."

fi


Vì tất cả các biểu thức và toán tử được sử dụng bởi thử nghiệm được coi là đối số lệnh bởi shell (không giống như [[]] (()) ), các ký tự có ý nghĩa đặc biệt đối với bash, Chẳng hạn như <, >, (), phải được trích dẫn hoặc thoát.

hình ảnh

Nhìn thấy rằng thử nghiệm [[]] làm đại khái điều tương tự, cái nào thích hợp hơn? thử nghiệm là truyền thống (và là một phần của POSIX), trong khi [[]] là cụ thể cho bash. Điều quan trọng là phải biết cách sử dụng thử nghiệm, vì nó được sử dụng rất rộng rãi, nhưng [[]] rõ ràng là hữu ích hơn và dễ viết mã hơn, vì vậy nó được ưu tiên cho các tập lệnh hiện đại.


Khả năng di chuyển là Hobgoblin của những tâm trí nhỏ

Nếu bạn nói chuyện với những người Unix “thực”, bạn nhanh chóng phát hiện ra rằng nhiều người trong số họ không thích Linux cho lắm. Họ coi đó là sự không trong sạch và không trong sạch. Một nguyên lý của người dùng Unix là mọi thứ phải “di động”. Điều này có nghĩa là bất kỳ tập lệnh nào bạn viết đều có thể chạy, không thay đổi, trên bất kỳ hệ thống giống Unix nào.

Mọi người Unix có lý do chính đáng để tin vào điều này. Đã từng chứng kiến ​​những áp lực độc quyền đối với các lệnh và shell đã gây ra cho thế giới Unix trước POSIX, họ tự nhiên cảnh giác về ảnh hưởng của Linux đối với hệ điều hành yêu quý của họ.

Nhưng tính di động có một mặt trái nghiêm trọng. Nó ngăn cản sự tiến bộ. Nó đòi hỏi mọi thứ luôn được thực hiện bằng kỹ thuật “mẫu số chung thấp nhất”. Trong trường hợp lập trình shell, điều đó có nghĩa là làm cho mọi thứ tương thích với sh, vỏ Bourne nguyên bản.



hình ảnh

Nhược điểm này là cái cớ mà các nhà cung cấp phần mềm độc quyền sử dụng để biện minh cho các tiện ích mở rộng độc quyền của họ, chỉ họ gọi chúng là “đổi mới”. Nhưng chúng thực sự chỉ là thiết bị khóa cho khách hàng của họ.

Các công cụ GNU, chẳng hạn như bash, không có hạn chế như vậy. Họ khuyến khích tính linh hoạt bằng cách hỗ trợ các tiêu chuẩn và bằng cách phổ biến rộng rãi. Bạn có thể cài đặt bash và các công cụ GNU khác trên hầu hết mọi loại hệ thống, ngay cả Windows, mà không tốn phí. Vì vậy, hãy thoải mái sử dụng tất cả các tính năng của bash. nó là có thật không xách tay.


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