Mới ;&
và các ;;&
nhà khai thác đã được giới thiệu trong Bash
4.0
và mặc dù cả hai đều có thể hữu ích trong các tình huống tương tự tôi nghĩ rằng chúng không có ích trong trường hợp của bạn. Đây là những gì man bash
nói về các nhà khai thác:
Nếu ;; Toán tử được sử dụng, không có kết quả khớp tiếp theo nào được thử sau khớp mẫu đầu tiên. Sử dụng; & thay cho ;; khiến việc thực thi tiếp tục với danh sách được liên kết với tập mẫu tiếp theo. Sử dụng ;; & thay cho ;; khiến shell kiểm tra danh sách mẫu tiếp theo trong câu lệnh, nếu có, và thực hiện bất kỳ danh sách liên quan nào trên một kết quả khớp thành công.
Nói cách khác, ;&
là một sự sụp đổ và như chúng ta biết từ đó C
và
;;&
thực hiện bash
kiểm tra các trường hợp còn lại thay vì case
hoàn toàn trở về từ
khối. Bạn có thể tìm thấy một ví dụ hay về ;;&
hành động tại đây: /programming//a/24544780/3691891 .
Điều đó đang được nói, không phải ;&
cũng không ;;&
thể được sử dụng trong kịch bản của bạn bởi vì cả hai sẽ đi đến *)
đó sẽ luôn luôn chạy.
Kịch bản sau đây hoạt động và thực hiện những gì bạn muốn mà không cần sắp xếp lại logic mà chỉ xem nó như một ví dụ và không bao giờ dựa vào nó, nó quá mong manh. Tôi đã lấy ý tưởng từ
đây :
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
if [ $VAR -eq 1 ]; then
một phần của mã sang bất cứ thứ gì trong đó*)
? Bởi vì điều đó hoàn toàn khác với những gì được gọi là dự phòng, do đó làm cho câu hỏi của bạn trở nên hơi sai lệch.