Không có giá trị boolean trong một kịch bản lệnh shell (nghĩa là, một thứ bạn có thể lưu trữ trong một biến và xử lý dưới dạng boolean). true
và false
là các lệnh; true
lần thoát với giá trị 0 và false
lần thoát với giá trị không đồng bộ. An tuyên bố if
trong bash taks một lệnh; nếu lệnh đó trả về 0, thì mệnh đề then
được thực thi, nếu không mệnh đề else
là.
doFirst= true
Dòng này không làm những gì bạn mong đợi. Trong một kịch bản lệnh shell, bạn không thể có bất kỳ dấu cách nào sau dấu bằng. Không gian có nghĩa là bạn đã hoàn thành nhiệm vụ, và bây giờ viết một lệnh. Điều này tương đương với:
doFirst="" true
Hơn nữa, nếu bạn có nhiệm vụ trước lệnh (như thế này), thực tế không thực hiện nhiệm vụ trong vỏ. Điều đó đặt biến môi trường trong môi trường cho lệnh đó một mình; nhiệm vụ không ảnh hưởng đến bất kỳ điều gì ngoài lệnh đó.
if $doFirst ; then
Điều này mở rộng biến $doFirst
và cố gắng diễn giải kết quả dưới dạng lệnh. Kỳ lạ thay, nếu $doFirst
không xác định (như tôi đã giải thích ở trên), điều này có chi nhánh then
. Tại thời điểm đó, bạn mắc lỗi đầu tiên của bạn một lần nữa, cố gắng thiết lập một biến là sai, và một lần nữa, không có gì xảy ra; $doFirst
không được xác định. Bạn phạm sai lầm hơn nữa khi cố gắng chỉ định $doFirst
; bạn sử dụng $
để lấy giá trị của một biến, khi thiết lập, bạn sử dụng tên trống.
Đề xuất của tôi sẽ không cố gắng sử dụng các boolean trong Bash; chỉ cần sử dụng chuỗi thay thế và kiểm tra giá trị của chuỗi. Lưu ý rằng tôi xóa không gian, vì vậy bây giờ tôi đang đặt nó vào chuỗi chính xác đó; và không có lệnh, do đó, điều này đặt biến trong vỏ, không phải trong môi trường cho một lệnh duy nhất:
doFirst=true
# ...
if [ $doFirst = true ]; then
doFirst=false
# ...
Nguồn
2012-11-25 06:47:04
Đã cố gắng xóa '$'? 'doFirst = false' –
Trong' echo', bạn không cần dấu ngoặc kép quanh '$ seatChoses'. – siride
Hi Anders, tôi thực sự đang truy cập cùng một biến như được khai báo trong dòng đầu tiên ... Tôi vẫn có thể xóa $? –