我有一个 shell 脚本正在执行连接性能测试,如果花费太长时间,我就会超时。
超时后,它会记录一些命令的结果,以便我可以了解发生故障时的系统状态。我想根据超时的测试阶段运行一些命令。
我想出了以下脚本:
#!/bin/bash
TESTCASE="INITIAL"
function testing()
{
let TESTCASE="FIRST"
#do some testing
let TESTCASE="SECOND"
#do some testing
let TESTCASE="THIRD"
#do some testing
}
function logonerror(){
if [ "$TESTCASE" = "FIRST" ]; then
#logging command relevant to first test case
elif [ "$TESTCASE" = "SECOND" ]; then
#logging command relevant to second test case
elif [ "$TESTCASE" = "THIRD" ]; then
#logging command relevant to third test case
fi
#some additional standard logging
}
timeout 7200 cat <( testing )
if (($? == 124)); then
logonerror
fi
cleanup
我唯一的问题是,哪个阶段超时并不重要,在进行日志记录时,它总是认为它处于初始阶段。
如何确保测试阶段信息得到正确更新?
答案1
你的第一个问题是:
let TESTCASE="UNSET_INTEGER_VARIABLE_NAME"
let
处理数学。在语句中进行的赋值let
将分配整数值。在 shell 算术上下文中FIRST
,您分配给所有值的 , SECOND
,值的计算结果为零,因为它们被认为是未设置的变量名称 - 而不是文字值。THIRD
$TESTCASE
unset FIRST
let TESTCASE=FIRST
echo "$TESTCASE"
0
...或者...
FIRST=10
let TESTCASE=FIRST
echo "$TESTCASE"
10
因此,您所做的每个赋值都会分配相同的值,除非在运行之前将$TESTCASE
任何名为FIRST
、SECOND
、THIRD
或 的变量INITIAL
添加到其环境中。export
要将字符串分配FIRST
给 shell 变量,$TESTCASE
您应该执行以下操作:
TESTCASE=FIRST
echo "$TESTCASE"
FIRST
您也可以考虑case
:
logonerror(){
case $TESTCASE in
(1) : logging commands relevant to 1st test case
;;
(2) : logging commands relevant to 2nd test case
;;
(3) : logging commands relevant to 3rd test case
;;
esac; : logging commands relevant to all test cases
}
testing()
case $TESTCASE in
(1) : do some testing
;;
(2) : do some testing
;;
(3) : do some testing
;;
esac
trap cleanup EXIT
{ trap 'logonerror >&2; exit' PIPE
for TESTCASE in 1 2 3; do testing; done >&2;:
}|{ read -t 7200; kill -PIPE -0; }