not exit a bash script when one of the sub-script fails

Viewed 368

I am new to shell script. I have a script that runs several test scripts using different input files. Currently it exits if any one of the input test fails. I want the test to complete running the loop and exits with all errors accumulated at last.

main.sh

set -e ;
set -x ;
for f in $files;do
    ./scripts/test_script.sh $f
done

======================

test_script.sh : runs few stuff and exits like this.

:
:
:
exit $?

================

1 Answers

set -e is what causes your script to exit immediately after a failed command. Get rid of it.

If you want the exit status to be 1 if any test fails, try out the following:

exit_status=0

for f in $files; do
  if ! ./scripts/test_script.sh "$f"; then
    exit_status=1
  fi
done

exit "$exit_status"

The value of exit_status will only be changed from 0 to 1 if an invocation of test_script.sh has a non-zero exit status.


Update: you can collect the failed scripts in an array (which you should also be using to store the list of files):

files=(foo.txt bar.txt)
failed=()

for f in "${files[@]}"; do
  ./scripts/test_script.sh "$f" || failed+=("$f")
done

if (( ${#failed[@]} != 0 )); then
  echo "Failed:"
  printf '  %s\n' "${failed[@]}"
  exit 1
else
  exit 0
fi
Related