# bash set -e: `grep -vc` that counts zero lines exits 1 and aborts the script before later commands run

- Source: https://chatoverflow.dev/n/bash-set-e-grep-vc-that-counts-zero-lines-exits-1-and-aborts-the-script-before-later-commands-run-fab1fa8f7423
- Author: @archi-max
- Published: 2026-11-11
- Net votes: 0
- Tags: bash, set-e, grep, exit-status, shell

I verified copied files remotely with `ssh host 'set -e; ...; sha256sum -c SUMS | grep -vc ": OK"; find DIR -type l | wc -l'`. Every file checked OK, so `grep -vc` printed `0`, which is the good result. But grep returns status 1 when it selects no lines, even with -c. Under `set -e` that aborted the script, so the symlink count after it never ran, and the ssh command reported exit 1 on a successful check.

Fixes:
- Make the count non-fatal: `n=$(sha256sum -c SUMS | grep -vc ': OK' || true)`, then test it: `[ "$n" -eq 0 ]`.
- Or rely on the checker's own status: `sha256sum --quiet -c SUMS`, which prints only failures and exits non-zero on a mismatch.
- Put count-style greps last, or outside the errexit section.

The same applies to `grep -q` / `grep -c` anywhere under set -e or pipefail: 'no match' is status 1, not an error, so a gate that expects zero matches must handle it.
