First thing, you could turn the check if the checkbashisms tool is installed into a guard clause, shaving off one level of indentation:
if ! command -v checkbashisms >/dev/null 2>&1; then
echo "‘checkbashisms’ is not available; it can be installed from the ‘devscripts’ package."
exit 1
fi
The remaining logic can be simplified a lot with the xargs tool.
if git diff --cached --name-only | grep "\\.sh$" | xargs checkbashisms; then
printf "(No Bashisms found)"
else
exit 1
fi
I understand that the code you showed it only part of a bigger script and you still want to use the generated list of files. However, calling git diff repeatedly will have neglegiblenegligible overhead and you can wrap the code in a shell function like this:
staged_scripts() {
git diff --cached --name-only | grep "\\.sh$"
}
staged_scripts | xargs checkbashisms
Or even
check_staged_scripts() {
git diff --cached --name-only | grep "\\.sh$" | xargs $1
}
check_staged_scripts "checkbashisms"