bash 脚本在变量赋值时崩溃

Posted

技术标签:

【中文标题】bash 脚本在变量赋值时崩溃【英文标题】:bash script crashes on variable assignment 【发布时间】: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之一! 【参考方案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

【讨论】:

以上是关于bash 脚本在变量赋值时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

(=)符号后有空格的变量赋值?

case语句中的变量赋值(bash)[重复]

bash 脚本编程 利用 “=” 赋值时,左右不能留空格

shell变量用grep怎么不能赋值

Bash中的变量

shell中$1赋值给变量,此变量却是空的,为啥?