ทางเลือกที่เข้ากันได้กับบอร์น ( ${#string}
เป็น POSIX แต่ไม่ใช่บอร์น (ไม่ใช่ว่าคุณน่าจะเคยเจอเชลล์เชลล์ในสมัยนี้)):
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
POSIX คุณควรพิจารณาเปลี่ยนสาย shebang#!/bin/sh
เป็นแบบพกพามากขึ้นและทำงานในสภาพแวดล้อมที่ไม่มีการทุบตี นอกจากนี้/bin/sh
อาจเป็นเปลือกที่เบากว่าเช่นเส้นประซึ่งไม่ได้รับภาระกับคุณสมบัติที่มีไว้สำหรับการใช้งานแบบโต้ตอบ