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 aboutset -e
之一!
【参考方案1】:
对于set -e
,结果为零的算术评估是您必须处理的“错误”。用一个简单的赋值替换有问题的let
会删除算术上下文,所以这可能是你应该做的。
您仍应查看脚本的其余部分是否存在类似问题,或者放弃使用set -e
,尤其是如果您不是 Bash 脚本专家。特别是,如果您正在测试的程序可以返回一个非零退出代码,那仍然会终止脚本。
【讨论】:
啊好吧,这很有道理我可能会找到另一种替代 set -e【参考方案2】:尝试去掉 let 并只使用简单的 '=' 赋值,let 通常只用于算术,它实际上与 (()) 相同。
【讨论】:
【参考方案3】:man set -e 如果简单命令以非零状态退出,则立即退出,除非 失败的命令是 until 或 while 循环的一部分,是 if 语句,&& 或 || 的一部分列表,或者如果命令的返回状态 正在使用 ! 反转。 -o 错误退出
man let 每个表达式都是要计算的算术表达式。如果最后一个表达式的计算结果为 0,则 let 返回 1;否则返回 0。
尝试删除 set -e
【讨论】:
以上是关于bash 脚本在变量赋值时崩溃的主要内容,如果未能解决你的问题,请参考以下文章