Không có goto
trong bash.
Đây là một số cách giải quyết bẩn sử dụng trap
mà chỉ nhảy ngược lại :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Đầu ra:
$ ./test.sh
foo
I am
here now.
Điều này không nên được sử dụng theo cách đó, nhưng chỉ cho mục đích giáo dục. Đây là lý do tại sao điều này hoạt động:
trap
đang sử dụng xử lý ngoại lệ để đạt được sự thay đổi trong dòng mã. Trong trường hợp trap
này, việc bắt bất cứ điều gì khiến tập lệnh EXIT. Lệnh goto
không tồn tại và do đó đưa ra một lỗi, thông thường sẽ thoát khỏi tập lệnh. Lỗi này đang bị bắt trap
và 2>/dev/null
ẩn thông báo lỗi thường được hiển thị.
Việc thực hiện goto này rõ ràng là không đáng tin cậy, vì bất kỳ lệnh không tồn tại nào (hoặc bất kỳ lỗi nào khác, theo cách đó), sẽ thực hiện cùng một lệnh bẫy. Cụ thể, bạn không thể chọn nhãn nào sẽ sử dụng.
Về cơ bản trong kịch bản thực tế, bạn không cần bất kỳ câu lệnh goto nào, chúng không cần thiết vì các cuộc gọi ngẫu nhiên đến các địa điểm khác nhau chỉ khiến mã của bạn trở nên khó hiểu.
Nếu mã của bạn được gọi nhiều lần, thì hãy xem xét sử dụng vòng lặp và thay đổi quy trình làm việc của nó để sử dụng continue
và break
.
Nếu mã của bạn tự lặp lại, hãy xem xét việc viết hàm và gọi nó nhiều lần bạn muốn.
Nếu mã của bạn cần nhảy vào phần cụ thể dựa trên giá trị biến, sau đó xem xét sử dụng case
câu lệnh.
Nếu bạn có thể tách mã dài của mình thành các phần nhỏ hơn, hãy xem xét chuyển mã thành các tệp riêng biệt và gọi chúng từ tập lệnh gốc.
goto
bash (ít nhất là nó nóicommand not found
với tôi). Tại sao? Có thể có một cách tốt hơn để làm điều đó.