2012-11-25 9 views
7

私はwhileループでブール値に問題があります。そのため、代わりにforループに切り替えます。 しかし、条件が満たされた後でもブール値の値を変更することはできません。シェルスクリプトのブール

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

こんにちはAnders、私は実際に最初の行で宣言されたものと同じ変数にアクセスしています... $をまだ削除できますか? –

答えて

18

シェルスクリプトにはブール値のようなものはありません(つまり、変数に格納してブール値として扱うことができます)。 trueおよびfalseはコマンドです。 trueは値0で終了し、falseはゼロ以外の値で終了します。 bashのステートメントはコマンドにtaks; ifそのコマンドが0を返した場合はthen句が実行され、それ以外の場合はelse句が実行されます。

doFirst= true 

この行は、まったく期待していません。シェルスクリプトでは、等号の後にスペースを入れることはできません。スペースとは、割り当てが完了し、コマンドを書き込んだことを意味します。あなたが実際にシェルの代入を実行しません(このような)コマンド、前の割り当てを持っている場合は、

doFirst="" true 

さらに:これは同等です。これは、環境内でそのコマンドのためだけに環境変数を設定します。割り当てはそのコマンドの外には何の影響も与えません。

if $doFirst ; then 

これは$doFirst変数を展開し、その結果をコマンドとして解釈しようとします。奇妙なことに、$doFirstが定義されていない場合(これは上で説明したとおりです)、これはthenブランチをとります。その時点で、あなたは最初に間違いを犯し、変数をfalseに設定しようとしましたが、何も起こりません。 $doFirstは未定義のままです。 $doFirstを割り当てようとすると間違いを犯します。変数の値を取得するには$を使用します。設定するときは、裸の名前を使用します。

私の推奨は、Bashでブーリアンを使用しないことです。その代わりに文字列を使用し、文字列の値を確認してください。私はスペースを削除するので、今私はその正確な文字列に設定していることに注意してください。コマンドがないので、単一のコマンドの環境ではなく、シェル内の変数を設定します:

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

こんにちは@ブライアン、コーチングに感謝します。しかし、このエラーは3行目で出てきました。私はどのように説明しますか? [:true:整数表現が必要です。 –

+1

@BryanWong申し訳ありませんが、 '-eq'の代わりに' == 'を使用してください。 '-eq'は数値を表し、' == 'は文字列を表します。私の答えを編集しました。 –

+0

#Brian Campbellありがとう! –

2

あなたが実際に=と「真」/「偽」またはフォーマットエラーということである間にスペースを入れていますか?それはあなたの問題の一つです。

コメント欄のAnders Lindahlが述べたように、シェルスクリプトで変数を設定すると、先頭に$を使用できなくなります。あなたは、等号の周りスペースがないことに注意してください、ここでも

doFirst=false 

を言わなければなりません。

+0

こんにちは、私は実際に最初の行で宣言されている変数と同じ変数にアクセスしています... $を削除することはできますか? –

+3

変数を読み込むときは '$'を、変数を割り当てるときは_not_を使います。例えば。 'doFirst = false'と' if $ doFirst'です。 – Barmar