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