Table-driven shell tests can store several case outcomes and count the failures in one loop.

Program

Play the script to choose whether one modeled case fails and watch the failure count change.

table_cases.sh
#!/usr/bin/env bash

fail_index=
cases=("login:pass" "search:pass" "deploy:pass")
if [[ "$fail_index" -gt 0 ]]; then
    cases[$fail_index]="deploy:fail"
fi
failures=0
for case_result in "${cases[@]}"; do
    if [[ "$case_result" == *":fail" ]]; then
        failures=$((failures + 1))
    fi
done
echo "failures=$failures"
#!/usr/bin/env bash

fail_index=
cases=("login:pass" "search:pass" "deploy:pass")
if [[ "$fail_index" -gt 0 ]]; then
    cases[$fail_index]="deploy:fail"
fi
failures=0
for case_result in "${cases[@]}"; do
    if [[ "$case_result" == *":fail" ]]; then
        failures=$((failures + 1))
    fi
done
echo "failures=$failures"
table-driven test A table keeps case data separate from the loop that evaluates it.
glob pattern `*":fail"` matches any case result ending in `:fail`.
failure count Counting failures produces a single value for CI or a summary line.