【问题标题】:bash script crashes on variable assignmentbash 脚本在变量赋值时崩溃
【发布时间】:2016-01-04 22:55:49
【问题描述】:

我正在编写一个 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 使用它来将变量分配给 0 ??
  • 这是the caveats about set -e之一!

标签: bash variables variable-assignment


【解决方案1】:

对于set -e,结果为零的算术评估是您必须处理的“错误”。用一个简单的赋值替换有问题的let 会删除算术上下文,所以这可能是你应该做的。

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

【讨论】:

  • 啊好吧,这很有道理我可能会找到另一种替代 set -e
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    ma​​n let 每个表达式都是要计算的算术表达式。如果最后一个表达式的计算结果为 0,则 let 返回 1;否则返回 0。

    尝试删除 set -e

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多