Các hàm trong Bash không phải là các hàm như trong ngôn ngữ khác; họ thực sự ra lệnh. Vì vậy, các hàm được sử dụng như thể chúng là nhị phân hoặc tập lệnh được tìm nạp từ đường dẫn của bạn. Từ quan điểm của logic chương trình của bạn nên thực sự không có sự khác biệt.
Các lệnh Shell được kết nối bằng các đường ống (còn gọi là luồng) và không phải là kiểu dữ liệu cơ bản hoặc do người dùng định nghĩa, như trong các ngôn ngữ lập trình "thực". Không có thứ nào giống như giá trị trả về cho một lệnh, có thể chủ yếu là vì không có cách nào thực sự để khai báo nó. Nó có thể xảy ra trên trang man, hoặc --help
đầu ra của lệnh, nhưng cả hai chỉ có thể đọc được bằng con người và do đó được ghi vào gió.
Khi một lệnh muốn nhận đầu vào, nó sẽ đọc nó từ luồng đầu vào hoặc danh sách đối số. Trong cả hai trường hợp, chuỗi văn bản phải được phân tích cú pháp.
Khi một lệnh muốn trả về một cái gì đó, nó phải echo
cho dòng đầu ra của nó. Một cách khác thường được thực hành là lưu trữ giá trị trả về trong các biến toàn cục, chuyên dụng. Ghi vào luồng đầu ra rõ ràng và linh hoạt hơn, bởi vì nó cũng có thể lấy dữ liệu nhị phân. Ví dụ: bạn có thể trả lại BLOB dễ dàng:
encrypt() {
gpg -c -o- $1 # encrypt data in filename to stdout (asks for a passphrase)
}
encrypt public.dat > private.dat # write function result to file
Như những người khác đã viết trong luồng này, người gọi cũng có thể sử dụng thay thế lệnh $()
để nắm bắt đầu ra.
Song song, hàm sẽ "trả về" mã thoát của gpg
(GnuPG). Hãy nghĩ về mã thoát như một phần thưởng mà các ngôn ngữ khác không có, hoặc, tùy thuộc vào tính khí của bạn, như là một "Schmutzeffekt" của các hàm shell. Trạng thái này, theo quy ước, 0 khi thành công hoặc một số nguyên trong phạm vi 1-255 cho một thứ khác. Để làm rõ điều này: return
(như exit
) chỉ có thể lấy một giá trị từ 0-255 và các giá trị khác 0 không nhất thiết là lỗi, như thường được khẳng định.
Khi bạn không cung cấp một giá trị rõ ràng với return
trạng thái được lấy từ lệnh cuối cùng trong câu lệnh / hàm / lệnh Bash và vv. Vì vậy, luôn luôn có một trạng thái, và return
chỉ là một cách dễ dàng để cung cấp nó.
return
trong trường hợp của bạn về cơ bản là giống nhưexit code
phạm vi từ0 - 255
. Sử dụngecho
theo đề xuất của @septi. Mã thoát có thể được chụp với$?
.