Toán tử && thực thi lệnh tiếp theo nếu lệnh trước đó đã thực thi thành công, (mã thoát được trả về ($?) 0 = logic true).
Ở dạng A && B || C
, lệnh (hoặc điều kiện) A được ước tính và nếu A trả về true (thành công, mã thoát 0) thì lệnh B được thực thi. Nếu A thất bại (do đó sẽ trả về false - mã thoát khác 0) và / hoặc B không thành công (trả về false ) thì lệnh C sẽ được thực thi.
Ngoài ra &&
toán tử được sử dụng như một AND trong kiểm tra điều kiện và toán tử ||
hoạt động như OR trong kiểm tra điều kiện.
Tùy thuộc vào những gì bạn muốn làm với tập lệnh của mình, biểu mẫu A && B || C
có thể được sử dụng để kiểm tra điều kiện như ví dụ của bạn hoặc có thể được sử dụng để xâu chuỗi các lệnh và đảm bảo một loạt các lệnh sẽ được thực thi nếu các lệnh trước đó có mã thoát 0 thành công .
Đây là lý do tại sao thường thấy các lệnh như :
do_something && do_something_else_that_depended_on_something
.
Ví dụ:
apt-get update && apt-get upgrade
Nếu cập nhật thất bại thì việc nâng cấp không được thực thi, (có ý nghĩa trong thế giới thực ...).
mkdir test && echo "Something" > test/file
Phần echo "Something"
này sẽ chỉ được thực hiện nếu mkdir test
thành công và thao tác trả về mã thoát 0 .
./configure --prefix=/usr && make && sudo make install
Thường được tìm thấy trên các công việc biên dịch để xâu chuỗi các lệnh phụ thuộc cần thiết lại với nhau.
Nếu bạn cố gắng thực hiện các "chuỗi" ở trên với if - thì - nếu không, bạn sẽ cần nhiều lệnh và kiểm tra hơn (và do đó sẽ có nhiều mã hơn để viết - nhiều lỗi hơn) cho một nhiệm vụ đơn giản.
Ngoài ra, hãy nhớ rằng các chuỗi được xâu chuỗi với && và || được đọc bằng vỏ trái sang phải. Bạn có thể cần nhóm các lệnh và kiểm tra điều kiện với dấu ngoặc để phụ thuộc vào bước tiếp theo vào đầu ra thành công của một số lệnh trước đó. Ví dụ xem điều này:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
Hoặc một ví dụ thực tế:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Hãy nhớ rằng một số lệnh trả về các mã thoát khác nhau tùy thuộc vào quá trình được thực thi hoặc trả về các mã khác nhau tùy thuộc vào hành động của chúng, (ví dụ lệnh GNU diff
, trả về 1 nếu hai tệp khác nhau và 0 nếu không). Các lệnh như vậy cần được xử lý cẩn thận trong && và || .
Cũng chỉ để có tất cả các câu đố với nhau, hãy nhớ đến việc ghép các lệnh bằng ;
toán tử. Với một định dạng, A;B;C
tất cả các lệnh sẽ được thực thi theo chuỗi bất kể mã thoát lệnh là gì A
và B
.