2012-11-25 48 views
7

我對while循環的boolean有一個問題。因此,我改用for循環代替。 但仍然不能在符合條件後更改布爾值的值。Shell腳本中的布爾值

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

試過去除'$'? 'doFirst = false' –

+0

在你的'echo'中,你不需要引用'$ seatChoses'。 – siride

+0

嗨安德斯,我實際上訪問相同的變量在第一行中聲明...我可以仍然刪除$? –

回答

18

在shell腳本中沒有這樣的布爾值(也就是說,您可以將其存儲在變量中,並視爲布爾值)。 truefalse是命令; true以0值退出,並且false以非零值退出。 bash中的if聲明可以獲取命令;如果該命令返回0,則執行then子句,否則else子句是。

doFirst= true 

這條線沒有做你期望的。在shell腳本中,等號後面不能有空格。空間意味着你完成了任務,現在正在寫一個命令。這相當於:

doFirst="" true 

此外,如果你有一個命令(這樣的),實際上並不執行殼轉讓前轉讓。在那個命令的環境中設置該環境變量;該任務對該命令之外的任何內容都沒有影響。

if $doFirst ; then 

這擴大了$doFirst變量,並試圖將結果解釋爲命令。奇怪的是,如果$doFirst未定義(就像我上面解釋的那樣),這需要then分支。那時,你又犯了第一個錯誤,試圖設置一個變量爲假,並且再次沒有任何反應; $doFirst未定義。您進一步錯誤地嘗試分配$doFirst;使用$來獲取變量的值,在設置時使用裸名稱。

我的建議是不要嘗試在Bash中使用布爾值;只需使用字符串,並檢查字符串的值。請注意,我刪除了空格,所以現在我將它設置爲精確的字符串;並沒有命令,所以這個變量設置在shell中,而不是在單個命令的環境中:

doFirst=true 
# ... 
    if [ $doFirst = true ]; then 
     doFirst=false 
    # ... 
+0

嗨@布萊恩,謝謝你的指導。但是,它出現了你的第三行這個錯誤。我如何解釋? [:true:整數表達式預計 –

+1

@BryanWong對不起,使用'=='而不是'-eq'; '-eq'用於數字,'=='用於字符串。編輯我的答案。 –

+0

#布萊恩坎貝爾謝謝! –

2

你居然把=和「真」 /「假」或者是一個格式錯誤之間的空間?這是你的問題之一。

另外,正如Anders Lindahl在註釋部分中提到的那樣,當您在shell腳本中設置變量時,不能在前面使用$。你必須說

doFirst=false 

再次注意,有圍繞等於沒有空間簽名。

+0

嗨siride,我實際上訪問了第一行中聲明的相同的變量...我還可以刪除$? –

+3

您在讀取變量時使用'$',在分配變量時不使用_not_。例如。 'doFirst = false'與'if $ doFirst'。 – Barmar