#!/bin/bash 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 -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}" 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%, }"