Bourne uyumlu bir alternatif ( ${#string}
POSIX'dir ancak Bourne değil (bugünlerde Bourne kabuğuna rastlama ihtimaliniz yoktur)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Her ikisi için geldiğini hatırlatırız ${#string}
ve ????
bu bayt veya karakter sayısı olup olmayacağı, kabuk bağlı olacaktır. Genelde (ve POSIX tarafından zorunludur), karakter sayısıdır. Ancak dash
bunun gibi bazı kabukları çok bayt farkında değildir, bunun yerine bayt olacaktır.
Bununla birlikte mksh
, set -o utf8-mode
çok baytlık karakterleri anlayabilmesi için (UTF-8 yerel ayarlarında) gerekir:
$ 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 hattını değiştirmeyi düşünmelisiniz,#!/bin/sh
böylece daha taşınabilir ve bash'ın bulunmadığı ortamlarda çalıştırılabilir. Ayrıca,/bin/sh
etkileşimli kullanım için tasarlanan özelliklerle dolu olmayan çizgi gibi daha hafif bir kabuk olabilir.