Một lựa chọn thay thế tương thích với Bourne ( ${#string}
là POSIX nhưng không phải Bourne (không phải là bạn có thể gặp phải vỏ Bourne ngày nay)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Lưu ý rằng đối với cả hai ${#string}
và ????
, đó sẽ là số byte hoặc ký tự sẽ phụ thuộc vào trình bao. Nói chung (và được POSIX yêu cầu), đó là số lượng ký tự. Nhưng đối với một số shell như thế dash
không nhận biết nhiều byte, nó sẽ là byte thay thế.
Với mksh
, bạn cần set -o utf8-mode
(theo địa phương UTF-8) để nó hiểu các ký tự nhiều byte:
$ 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
. Bạn nên xem xét việc thay đổi dòng shebang để#!/bin/sh
nó dễ di chuyển hơn và chạy trong môi trường không có bash. Thêm vào đó,/bin/sh
có thể là một lớp vỏ nhẹ hơn như dấu gạch ngang không bị gánh nặng với các tính năng dành cho sử dụng tương tác.