Это сводится к проблеме итерации по буквам слова, которая не является тривиальной в bash. Мой подход ужасно хакерский, но, похоже, работает:
#!/bin/bash
WORD="$1"
REGEXP='';
ASCIISUM=0
while true; do
LETTER=$(echo "$WORD" | sed "s/$REGEXP\(.\).*/\1/")
test "$LETTER" == "$WORD" && break;
ASCII=$(printf '%d' "'$LETTER")
echo "Adding '$LETTER': $ASCII"
ASCIISUM=$(($ASCIISUM+$ASCII))
REGEXP=".$REGEXP"
done
echo "Sum of ASCII values of '$WORD': $ASCIISUM"
Сохраните, например, в asciisum.sh
и вызовите /path/to/asciisum.sh "word"
Редактировать:
Несколько слов объяснения:
- REGEXP используется для поддержания регулярного выражения периодов, ровно по одному на каждую проходящую букву - это соответствует буквам перед тем, который я хочу.
- Используя
sed
я теперь отфильтровываю эти уже готовые буквы и каждую букву после текущей, оставляя только текущую букву.
- Если мое регулярное выражение больше не соответствует (то есть слово не изменяется с помощью
sed
), цикл прерывается
- Оттуда это легко: вычислить ASCII код буквы и прибавить к сумме