web-dev-qa-db-ja.com

変数の長さを確認する

変数の読み取りの長さを確認する必要があります(スクリプトでは挿入文字数が5文字に制限されています)。次のようなことを考えています。

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

より「エレガントな」ソリューションはありますか?

31
Pol Hallen

もっとエレガント?番号

もっと短い?はい :)

#!/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"

安全だと思われる場合は、二重括弧を使用できます。 説明はこちら

48
user34720

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
3