7

我有一个布尔 for 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

在 shell 脚本中没有布尔值之类的东西(也就是说,您可以将其存储在变量中,并将其视为布尔值)。true并且false是命令;true以值 0false退出,并以非零值退出。ifbash 中的语句接受命令;如果该命令返回 0,则then执行该子句,否则执行该else子句。

doFirst= true

这条线根本不符合您的期望。在 shell 脚本中,等号后不能有任何空格。空格表示您已完成分配,现在正在编写命令。这相当于:

doFirst="" true

此外,如果您在命令之前有一个赋值(像这样),那实际上并没有在 shell 中执行赋值。仅在该命令的环境中设置该环境变量;该分配对该命令之外的任何内容都没有影响。

if  $doFirst ; then

这会扩展$doFirst变量,并尝试将结果解释为命令。奇怪的是,如果$doFirst是未定义的(正如我在上面解释的那样),这需要then分支。到那时,你又犯了第一个错误,试图将一个变量设置为假,但又一次,什么也没发生;$doFirst未定义。你犯了进一步的错误,试图分配$doFirst;您用于$获取变量的值,设置时使用裸名。

我的建议是不要尝试在 Bash 中使用布尔值;只需使用字符串,并检查字符串的值。请注意,我删除了空格,所以现在我将其设置为确切的字符串;并且没有命令,所以这会在 shell 中设置变量,而不是在单个命令的环境中:

doFirst=true
# ...
   if [ $doFirst = true ]; then
       doFirst=false
   # ...
于 2012-11-25T06:47:04.667 回答
2

您实际上是=在“真”/“假”之间放置一个空格还是格式错误?这是你的问题之一。

另一个,正如 Anders Lindahl 在评论部分提到的,当你在 shell 脚本中设置一个变量时,你不能$在前面使用。你必须说

doFirst=false

同样,请注意等号周围没有空格。

于 2012-11-25T06:27:02.480 回答