bash 脚本在变量赋值时崩溃

bash script crashes on variable assignment

我正在编写一个 bash 脚本来自动执行一些我需要 运行 多次输入变量数组的 opencv 代码。 出于某种原因,当我尝试将 0 分配给标志变量时,我的 bash 脚本一直崩溃。 我也在 if 循环之外尝试过这个,它也会导致脚本崩溃。

#!/bin/bash
set -e

# Build most recent code
cd build2/
cmake ..
make

Scale=(9 9)

inputType="scale"

flag=1
counter=0
for i in ${Scale[@]}; do
    echo iteration: $counter

    if [ $counter -eq 0 ]
    then
      echo first iteration
      let flag=0 #Crashes Here
      echo after assignment $flag

    else
      echo not first iteration
      let flag=1 #Doesn't crash here
      echo after assignment $flag
    fi

    echo starting program
    #Note 1.inputValue  2.Input Type 3.firstGo
    ./multiDimen ${i} $inputType $flag

    echo Test Type is: $inputType
    let counter=counter+1
done
echo Done

为什么会这样?

尝试去掉 let 并只使用简单的“=”赋值,let 通常只是用于算术运算,它实际上与 (()) 相同。

man set -e 如果一个简单命令以非零状态退出,则立即退出,除非 失败的命令是 until 或 while 循环的一部分,是 if 语句,&& 或 || 的一部分列表,或者如果命令的 return 状态 正在使用 ! 反转。 -o 退出

man let 每个表达式都是一个要求值的算术表达式。如果最后一个表达式的计算结果为 0,则让 returns 为 1;否则 0 是 returned.

尝试删除 set -e

对于 set -e,结果为零的算术计算是您必须处理的 "error"。用普通赋值替换有问题的 let 会删除算术上下文,所以这可能是您应该做的。

您仍应查看脚本的其余部分是否存在类似问题,或者放弃使用 set -e,尤其是当您不是 Bash 脚本专家时。特别是,如果您正在测试的程序可以 return 非零退出代码,那仍然会终止脚本。