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
4

2 に答える 2

21

シェル スクリプトにはブール値のようなものはありません (つまり、変数に格納してブール値として扱うことができるものです)。truefalseはコマンドです。true値 0 でfalse終了し、ゼロ以外の値で終了します。ifbashのステートメントはコマンドを受け取ります。そのコマンドが 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
   # ...
于 2012-11-25T06:47:04.667 に答える
2

=実際にと「true」/「false」の間にスペースを入れていますか、それともフォーマット エラーですか? それはあなたの問題の 1 つです。

もう 1 つは、コメント セクションで Anders Lindahl が述べたように、シェル スクリプトで変数を設定する場合$、前に を使用できないことです。あなたは言う必要があります

doFirst=false

ここでも、等号の前後にスペースがないことに注意してください。

于 2012-11-25T06:27:02.480 に答える