2012-11-25 41 views
7

Tôi gặp vấn đề với boolean for while loop. Như vậy, tôi chuyển sang vòng lặp thay thế. Tuy nhiên, tôi không thể thay đổi giá trị của boolean sau khi điều kiện được đáp ứng.Boolean trong Shell Scripting

doFirst= true 
    for ((j=1; j<=7; j++)) 
    do 
      letter="A" 
      seatChoses=$letter$j 

      flagRand=$(echo $flightSeatBooked | awk -v flseatRand=$flightSeatBooked -v orseatRand=$seatChoses '{print match(flseatRand, orseatRand)}') 
      if $doFirst ; then 
      **$doFirst= false** // Here is the error! 
       if [ $flagRand -eq 0 ]; then 
        echo "System generated a slot, "$seatChoses" for you. [Y or N]" 
       fi 
      fi 

    done 
+1

Đã cố gắng xóa '$'? 'doFirst = false' –

+0

Trong' echo', bạn không cần dấu ngoặc kép quanh '$ seatChoses'. – siride

+0

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 $? –

Trả lời

18

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). truefalse 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 
    # ... 
+0

Xin chào @Brian, Cảm ơn bạn đã hướng dẫn. Tuy nhiên, nó xuất hiện lỗi này cho dòng thứ 3 của bạn. Làm thế nào để tôi giải thích? [: true: biểu thức số nguyên mong đợi –

+1

@BryanWong Xin lỗi, sử dụng '==' thay vì '-eq'; '-eq' là cho các số,' == 'là dành cho các chuỗi. Đã chỉnh sửa câu trả lời của tôi. –

+0

#Brian Campbell Cảm ơn! –

2

Bạn đang đặt khoảng cách giữa = và "true"/"false" hoặc lỗi định dạng? Đó là một trong những vấn đề của bạn.

Khác, như đã đề cập bởi Anders Lindahl trong phần bình luận, là khi bạn đặt biến trong kịch bản lệnh shell, bạn không thể sử dụng $ ở mặt trước. Bạn phải nói

doFirst=false 

Một lần nữa, lưu ý rằng có không không gian xung quanh dấu bằng.

+0

Hi siride, 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 $? –

+3

Bạn sử dụng '$' khi đọc biến, _not_ khi gán biến. Ví dụ. 'doFirst = false' so với' if $ doFirst'. – Barmar

Các vấn đề liên quan