変数の読み取りの長さを確認する必要があります(スクリプトでは挿入文字数が5文字に制限されています)。次のようなことを考えています。
#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
より「エレガントな」ソリューションはありますか?
もっとエレガント?番号
もっと短い?はい :)
#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
また、エレガンスをトレードすることに問題がなければ、短い方を優先して、スクリプトを2行少なくすることができます。
#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"
安全だと思われる場合は、二重括弧を使用できます。 説明はこちら 。
Bourne互換の代替(${#string}
はPOSIXですがBourneではありません(最近、Bourne Shellに遭遇することはないでしょう)):
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