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