Tại sao bạn nên quan tâm những gì tôi nói mặc dù có câu trả lời hơn 250 câu trả lời
Nó không phải là 0 = true
và 1 = false
. Đó là: zero có nghĩa là không có thất bại (thành công) và khác không có nghĩa là thất bại (thuộc loại N) .
Mặc dù câu trả lời được chọn là "đúng" về mặt kỹ thuật, vui lòng không đặt return 1
** vào mã của bạn cho sai . Nó sẽ có một số tác dụng phụ đáng tiếc.
- Các nhà phát triển có kinh nghiệm sẽ nhận ra bạn là một người nghiệp dư (vì lý do dưới đây).
- Các nhà phát triển có kinh nghiệm không làm điều này (vì tất cả các lý do dưới đây).
- Đó là lỗi dễ bị.
- Ngay cả các nhà phát triển có kinh nghiệm cũng có thể nhầm 0 và 1 là sai và đúng tương ứng (vì lý do trên).
- Nó đòi hỏi (hoặc sẽ khuyến khích) những bình luận không liên quan và lố bịch.
- Nó thực sự ít hữu ích hơn các trạng thái trả lại ngầm.
Tìm hiểu một số bash
Các nhãn hiệu bash nói (tôi nhấn mạnh)
trở lại [n]
Làm cho hàm shell dừng thực thi và trả về giá trị n cho trình gọi của nó. Nếu n không được cung cấp , giá trị trả về là trạng thái thoát của lệnh cuối cùng được thực thi trong hàm.
Do đó, chúng ta không phải sử dụng 0 và 1 để chỉ đúng và sai. Thực tế là họ làm như vậy về cơ bản là kiến thức tầm thường chỉ hữu ích cho việc gỡ lỗi mã, câu hỏi phỏng vấn và thổi bùng tâm trí của người mới.
Hướng dẫn bash cũng nói
mặt khác, trạng thái trả về của hàm là trạng thái thoát của lệnh cuối cùng được thực thi
Hướng dẫn bash cũng nói
( $? ) Mở rộng đến trạng thái thoát của đường ống tiền cảnh được thực hiện gần đây nhất .
Whoa, đợi đã. Đường ống? Hãy chuyển sang hướng dẫn sử dụng bash một lần nữa.
Đường ống là một chuỗi gồm một hoặc nhiều lệnh được phân tách bằng một trong các toán tử điều khiển '|' hoặc '| &'.
Đúng. Họ nói 1 lệnh là một đường ống dẫn. Do đó, cả 3 trích dẫn này đều nói giống nhau.
$?
cho bạn biết những gì đã xảy ra cuối cùng.
- Nó bong bóng lên.
Câu trả lời của tôi
Vì vậy, trong khi @Kambus chứng minh rằng với một chức năng đơn giản như vậy, không return
cần thiết chút nào. Tôi nghĩ là đơn giản phi thực tế so với nhu cầu của hầu hết những người sẽ đọc này.
Tại sao return
?
Nếu một hàm sẽ trả về trạng thái thoát lệnh cuối cùng của nó, tại sao lại sử dụng return
? Bởi vì nó gây ra một chức năng để ngừng thực thi.
Dừng thực thi trong nhiều điều kiện
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
Những gì chúng ta có ở đây là ...
Dòng 04
là trả về [-ish] rõ ràng vì RHS &&
chỉ được thực thi nếu LHS đúng
Dòng 09
trả về đúng hoặc sai khớp với trạng thái của dòng08
Dòng 13
trả về sai vì dòng12
(Vâng, điều này có thể được đánh xuống, nhưng toàn bộ ví dụ là có thể.)
Một mô hình phổ biến khác
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
Lưu ý cách thiết lập một status
biến làm sáng tỏ ý nghĩa của $?
. (Tất nhiên bạn biết những gì $?
phương tiện, nhưng ai đó ít hiểu biết hơn bạn sẽ phải Google nó một ngày nào đó. Trừ phi mã của bạn đang làm giao dịch tần số cao, hiển thị một số tình yêu , đặt biến.) Tuy nhiên, take-away thực sự là "nếu không tồn tại trạng thái "hoặc ngược lại" nếu trạng thái thoát "có thể được đọc thành tiếng và giải thích ý nghĩa của chúng. Tuy nhiên, cái cuối cùng đó có thể là một chút quá tham vọng bởi vì nhìn thấy từ này exit
có thể khiến bạn nghĩ rằng nó đang thoát khỏi kịch bản, trong khi thực tế, nó đang thoát khỏi $(...)
subshell.
** Nếu bạn hoàn toàn khăng khăng sử dụng return 1
sai, tôi khuyên bạn ít nhất nên sử dụng return 255
thay thế. Điều này sẽ khiến bản thân tương lai của bạn hoặc bất kỳ nhà phát triển nào khác phải duy trì mã của bạn đặt câu hỏi "tại sao lại là 255?" Sau đó, ít nhất họ sẽ được chú ý và có cơ hội tốt hơn để tránh một sai lầm.
function
từ khóa,myfun() {...}
đủ