Uma alternativa compatível com Bourne ( ${#string}
é POSIX, mas não Bourne (não é provável que você encontre um shell Bourne atualmente):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Observe que para ambos ${#string}
e ????
, se será o número de bytes ou caracteres, dependerá do shell. Geralmente (e é exigido pelo POSIX), é o número de caracteres. Mas para alguns shells como dash
esse não são compatíveis com vários bytes, serão bytes.
Com mksh
, você precisa set -o utf8-mode
(em localidades UTF-8) para entender caracteres de vários bytes:
$ 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
. Você deve alterar a linha shebang para#!/bin/sh
para que fique mais portátil e execute em ambientes onde o bash não está disponível. Além disso,/bin/sh
pode ser um shell mais leve, como o dash, que não está sobrecarregado com os recursos destinados ao uso interativo.