変数の長さを検証する


27

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

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

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


1
スクリプトは標準POSIXで正しく機能します/bin/sh#!/bin/sh移植性を高め、bashが利用できない環境で実行されるように、shebang行を変更することを検討する必要があります。さらに、/bin/shインタラクティブな使用を目的とした機能を備えていない、ダッシュのようなより軽量なシェルである可能性があります。
セラダ14

@Celada、この場合は真ですが、dash's ${#string}は文字ではなくバイト数で長さを示します。
ステファンシャゼラス

回答:


43

もっとエレガント?いや

短い?はい :)

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

より安全だと思う場合は、二重括弧を使用できます。ここで説明


3

Bourne互換の代替(${#string}POSIXであるがBourneではない(最近Bourneシェルに出くわす可能性があるということではない)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

両方のためにそのノート${#string}????、それはバイト数または文字数であるかどうかを、シェルに依存するであろう。通常(およびPOSIXで必要)、これは文字数です。しかし、そのような一部のシェルdashではマルチバイト対応ではないため、代わりにバイトになります。

ではmkshset -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

トピックから外れていますがecho Too long、ボンネットの下では異なりますecho 'Too long'
スティーブンペニー

そして、「長すぎる」ときに印刷するだけなら、ifオプションでさらに圧縮できます:)

2
@StevenPennyは、echo Too long2つの引数(Tooおよびlong)を渡します。echoこれらのecho出力にはスペースで区切られ(その後に改行が続きます)、一方、引数にはecho 'Too long'1つのToo long引数が渡さechoれ、その後に改行が表示されます。したがって、機能的には同等です。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.