変数の長さを確認する

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

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

もっと「エレガントな」解決策はありますか?

コメント

  • スクリプトは標準のPOSIX /bin/shで正しく機能します。移植性を高めるためにshebang行を#!/bin/shに変更することを検討する必要があります。 bashが利用できない環境で実行します'さらに、/bin/shは、ダッシュのようなより軽量なシェルである可能性があります'インタラクティブな使用を目的とした機能を負担していません。
  • @Celada、この場合は本当ですが、dash ' s ${#string}は、文字ではなくバイト数で長さを示します。

回答

Mエレガントな鉱石?いいえ

短いですか?はい:)

#!/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シェルに遭遇する可能性が高いわけではありません)):

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 

コメント

  • トピックから外れていますが、echo 'Too long'echo Too long異なります>
  • そして、' "長すぎるときに印刷する場合"、ifオプションでさらに圧縮できます:)
  • @ StevenPenny、echo Too long 2つの引数(Toolong)をechoに渡します。echo出力はスペースで区切られ(その後に改行が続きます)、echo 'Too long'では、1つのToo longを渡します。 改行が続くように表示されます。したがって、'は機能的に同等です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です