Una alternativa compatible con Bourne ( ${#string}
es POSIX pero no Bourne (no es probable que encuentre un shell Bourne en estos días)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Tenga en cuenta que para ambos ${#string}
y ????
, si será el número de bytes o caracteres dependerá del shell. Generalmente (y es requerido por POSIX), es el número de caracteres. Pero para algunos shells como dash
ese no son compatibles con varios bytes, en su lugar serán bytes.
Con mksh
, necesita set -o utf8-mode
(en configuraciones regionales UTF-8) para que comprenda los caracteres de varios 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
. Debería considerar cambiar la línea shebang a#!/bin/sh
para que sea más portátil y se ejecute en entornos donde bash no esté disponible. Además,/bin/sh
podría ser un shell más liviano como el tablero que no está cargado con características destinadas para uso interactivo.