Лично я бы сделал это так:
#! /usr/bin/env bash
log() {
{
printf '%s: ' "${0##*/}"
printf "$@"
printf '\n'
} >&2
}
cksum() {
tot=${#1}
let len=tot-4
let res=0
while [ $len -gt 0 ]; do
let res^=$( LC_CTYPE=C printf '%d' "'${1:$len:1}'" )
let len--
done
let ptr=tot-2
if [ x"$( printf '%s' "${1:$ptr}" | tr a-f A-F )" != x"$( printf '%02X' $res )" ]; then
log '%s: invalid checksum (found %02X)' "$1" $res
fi
}
check () {
if expr "$2" : '\$.*\*[0-9a-fA-F][0-9a-fA-F]$' >/dev/null; then
cksum "$2"
else
log 'invalid input on line %d: %s' "$1" "$2"
fi
}
let cnt=0
if [ $# -ne 0 ]; then
while [ $# -gt 0 ]; do
let cnt++
check $cnt "$1"
shift
done
else
while read -r str; do
let cnt++
check $cnt "$str"
done
fi
Строка shebang утверждает bash
, но он должен работать для ksh93r
и zsh
. Нет зависимости от xxd
. Не претендую на то, чтобы быть примером стиля написания сценария, которому нужно следовать. :)