#!/bin/bash # reshellcheck.sh - Run shellcheck and summerize output. # (C) 2022-2025 F-Hauri - http://www.f-hauri.ch # Version: 0.0.3 -- Last update: Thu Apr 10 17:12:45 CEST 2025 shopt -s extglob declare -a tline=() scalst=() scamsg=() declare -i tot=0 declare -A severity='()' showLineAt() { local col="$2" sedlne sedcmd="$1{" local -i lne=$(($1)) num i read -ra col <<<"$col" num=$((${#col[@]})) for ((i=1;i<=num;i++)); do printf -v sedlne 's/^\(.\{%d\}\)\(.\)/\\1\\o33[31;1m\\2\\o33[0m/;' \ $((${col[num-i]}-1)) sedcmd+="$sedlne" done printf -v sedcmd '%s s/^/%8d (%d): /;p;};' "$sedcmd" $lne $num sed -ne "$sedcmd" } while IFS=: read -r file line col level msg; do : "$file" # prevent "SC2034: file appears unused." msgid=${msg##* } msgid=${msgid//*([\[SC\]])} scamsg[10#$msgid]="${msg% "[SC$msgid]"}" severity[${level// }]+="$msgid " scalst[10#$msgid]+="$line:$col " done < <(shellcheck -x -s bash -f gcc - <"$1") for level in style note warning error; do if [ "${severity[$level]}" ] ;then read -ra llist <<<"${severity[$level]}" echo ${level^^} ${#llist[@]}x tline+=("${#llist[@]} $level") tot+=${#llist[@]} printf -v llist '[%s]="" ' "${llist[@]}" declare -a llist="($llist)" for i in "${!llist[@]}" ; do read -ra sclist <<<"${scalst[i]}" printf ' %2dx SC%04d: %s\n' ${#sclist[@]} "$i" "${scamsg[i]}" sclist=("${sclist[*]//:/ }") read -ra sclist <<<"${sclist[0]}" printf -v bysc ' [%d]+="%d " ' "${sclist[@]}" declare -a bysc="($bysc)" for k in "${!bysc[@]}" ;do showLineAt "$k" "${bysc[k]}" <"$1" done done fi done printf -v tline "%s, " "${tline[@]}" printf 'Total: %d remarks (%s).\n' "$tot" "${tline%, }"