在bash脚本中测试多个值的最有效方法是什么

时间:2015-03-06 01:18:39

标签: bash

我需要针对三个变量运行测试。如果所有三个变量都设置为预期值,则测试将通过。如果只有两个或一个则测试将失败。这个想法是,如果任何失败,那么将报告。我怎样才能最有效地做到这一点?

目前,我只能将其设置为if ... elif块的大量字符串。

if [[ test1 ]] && [[ test2 ]] && [[ test3 ]]
then
# repeat until all combinations of true and false results are exhausted.

如果不创建八个不同的if...elif测试,您将如何测试所有组合?

test1 && test2 && test3
test1 && !test2 && test3
test1 && test2 && !test3
test1 && !test2 && !test3
!test1 && test2 && test3
!test1 && !test2 && test3
!test1 && test2 && !test3
!test1 && !test2 && !test3

4 个答案:

答案 0 :(得分:2)

也许这可以像单独检查三个变量一样简单吗?

pass=1
[[ test1 ]] || { echo 'test1 failed'; pass=0 }
[[ test2 ]] || { echo 'test2 failed'; pass=0 }
[[ test3 ]] || { echo 'test3 failed'; pass=0 }
[[ $pass -eq 0 ]] && echo 'one of the tests failed'

答案 1 :(得分:1)

您可以计算失败的测试次数。 Bash有几种方法可以进行整数运算。

score=0
if ! [[ test1 ]]; then score=$((score + 1)); fi
if ! [[ test2 ]]; then score=$((score + 1)); fi
if ! [[ test3 ]]; then score=$((score + 1)); fi

if [ $score != 0 ]; then echo $score tests failed; fi

答案 2 :(得分:0)

如果您的测试是独立的并且都希望在所有情况下都进行测试,那么最简单的方法就是测试它们并跟踪它们是否有任何失败。

这样的事情:

if ! [[ test1 ]]; then
    echo 'Report test1 failure.'
    failed=1
fi

if ! [[ test2 ]]; then
    echo 'Report test2 failure.'
    failed=1
fi

if ! [[ test3 ]]; then
    echo 'Report test3 failure.'
    failed=1
fi

if [[ "$failed" = 1 ]]; then
    exit 1
fi

答案 3 :(得分:0)

if ! ( test1 && test2 && test3 ) ; then
    echo "fail"
    exit 1
else echo "success"
fi