Сумісна з 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може бути більш легка оболонка, як тире, яка не обтяжена функціями, призначеними для інтерактивного використання.