我有一个boolean 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
Run Code Online (Sandbox Code Playgroud)
Bri*_*ell 21
在shell脚本中没有布尔值这样的东西(也就是说,你可以存储在变量中的东西,并视为布尔值).true
并且false
是命令; true
以值0 false
退出,并以非零值退出.if
bash中的声明可以发出命令; 如果该命令返回0,则then
执行该else
子句,否则该子句为.
doFirst= true
Run Code Online (Sandbox Code Playgroud)
这条线根本不符合您的预期.在shell脚本中,等号后面不能有任何空格.空间意味着你已完成任务,现在正在编写命令.这相当于:
doFirst="" true
Run Code Online (Sandbox Code Playgroud)
此外,如果您在命令之前有一个赋值(像这样),那么它实际上并不在shell中执行赋值.这仅在该命令的环境中设置了该环境变量; 赋值对该命令之外的任何内容都没有影响.
if $doFirst ; then
Run Code Online (Sandbox Code Playgroud)
这会扩展$doFirst
变量,并尝试将结果解释为命令.奇怪的是,如果$doFirst
是未定义的(正如我上面解释的那样),这就是then
分支.此时,你再次犯了第一个错误,试图将变量设置为假,再一次,没有任何反应; $doFirst
未定义.你犯了进一步分配的错误$doFirst
; 你用$
得到一个变量的值,设定时,可以使用裸名.
我的建议是不要试图在Bash中使用布尔值; 只需使用字符串,并检查字符串的值.请注意,我删除了空格,所以现在我将它设置为那个确切的字符串; 并且没有命令,因此这将在shell中设置变量,而不是在单个命令的环境中:
doFirst=true
# ...
if [ $doFirst = true ]; then
doFirst=false
# ...
Run Code Online (Sandbox Code Playgroud)