Bourne-совместимая альтернатива ( ${#string}это POSIX, но не Bourne (не то, чтобы вы когда-нибудь встречали оболочку Bourne в наши дни)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Обратите внимание, что для обоих ${#string}и ????того, будет ли это число байтов или символов, будет зависеть от оболочки. Как правило (и это требуется POSIX), это количество символов. Но для некоторых таких оболочек, как dashэто не многобайтовый, вместо этого будут байты.
С помощью mkshвам set -o utf8-mode(в локалях UTF-8) нужно понимать многобайтовые символы:
$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8
/bin/sh. Вам следует подумать об изменении строки shebang,#!/bin/shчтобы она была более переносимой и работала в средах, где bash недоступен. Кроме того, это/bin/shможет быть более легкая оболочка, такая как dash, которая не обременена функциями, предназначенными для интерактивного использования.