Tôi luôn cố gắng gắn bó với POSIX sh
thay vì sử dụng các phần mở rộng Bash, vì một trong những điểm chính của kịch bản là tính di động (bên cạnh việc kết nối các chương trình, không thay thế chúng).
Trong sh
đó, có một cách dễ dàng để kiểm tra điều kiện "tiền tố".
case $HOST in node*)
# Your code here
esac
Dựa vào độ tuổi, arcane và shufty sh (và Bash không phải là thuốc chữa bệnh: Nó phức tạp hơn, ít nhất quán hơn và ít di động hơn), tôi muốn chỉ ra một khía cạnh chức năng rất hay: Trong khi một số yếu tố cú pháp như case
được tích hợp sẵn , các cấu trúc kết quả không khác gì bất kỳ công việc nào khác. Chúng có thể được sáng tác theo cùng một cách:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Hoặc thậm chí ngắn hơn
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Hoặc thậm chí ngắn hơn (chỉ để trình bày !
như một yếu tố ngôn ngữ - nhưng bây giờ đây là phong cách xấu)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Nếu bạn thích rõ ràng, hãy xây dựng yếu tố ngôn ngữ của riêng bạn:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Điều này thực sự không đẹp sao?
if beginswith node "$HOST"; then
# Your code here
fi
Và vì sh
về cơ bản chỉ là các công việc và danh sách chuỗi (và các quy trình nội bộ, trong đó các công việc được tạo ra), bây giờ chúng ta thậm chí có thể thực hiện một số lập trình chức năng nhẹ:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
Đây là thanh lịch. Không phải là tôi ủng hộ việc sử dụng sh
cho bất cứ điều gì nghiêm trọng - nó phá vỡ tất cả quá nhanh theo yêu cầu của thế giới thực (không có lambdas, vì vậy chúng tôi phải sử dụng chuỗi. Nhưng không thể gọi chức năng lồng với chuỗi, v.v.)