mik*_*mik 9 bash shell scripting exit-code
我需要在脚本中依赖于几个单独的执行,并且不希望将它们全部捆绑在一个丑陋的'if'语句中.我想把退出代码'$?' 每次执行并添加它; 最后,如果这个值超过一个阈值 - 我想执行一个命令.
伪代码:
ALLOWEDERROR=5
run_something
RESULT=$?
..other things..
run_something_else
RESULT=$RESULT + $?
if [ $RESULT -gt ALLOWEDERROR ]
then echo "Too many errors"
fi
Run Code Online (Sandbox Code Playgroud)
问题:即使互联网声称不然,bash拒绝对待RESULT和$?作为整数.什么是正确的语法?
谢谢.
Ale*_*own 15
快速实验并深入了解bash信息说:
declare -i RESULT=$RESULT + $?
Run Code Online (Sandbox Code Playgroud)
由于您要多次添加结果,因此可以在开头使用declare,如下所示:
declare -i RESULT=0
true
RESULT+=$?
false
RESULT+=$?
false
RESULT+=$?
echo $RESULT
2
Run Code Online (Sandbox Code Playgroud)
看起来更清洁.
declare -i 说变量是整数.
或者,您可以避免声明并使用算术表达式括号:
RESULT=$(($RESULT+$?))
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 10
您可能需要查看trap内置函数以查看它是否有用:
help trap
Run Code Online (Sandbox Code Playgroud)
要么
man bash
Run Code Online (Sandbox Code Playgroud)
你可以为这样的错误设置一个陷阱:
#!/bin/bash
AllowedError=5
SomeErrorHandler () {
(( errcount++ )) # or (( errcount += $? ))
if (( errcount > $AllowedError ))
then
echo "Too many errors"
exit $errcount
fi
}
trap SomeErrorHandler ERR
for i in {1..6}
do
false
echo "Reached $i" # "Reached 6" is never printed
done
echo "completed" # this is never printed
Run Code Online (Sandbox Code Playgroud)
如果你计算错误(并且只有当它们是错误时),而不是使用" $?",那么你不必担心返回值不是零或一.例如,单个返回值127会立即超过您的阈值.trap除了之外,您还可以为其他信号注册s ERR.
| 归档时间: |
|
| 查看次数: |
9558 次 |
| 最近记录: |