読み取り変数の長さを確認する必要があります(スクリプトでは挿入される文字が5文字に制限されています)。これ:
#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi
もっと「エレガントな」解決策はありますか?
コメント
回答
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'
divとは内部的にはecho Too long
異なります> - そして、' "長すぎるときに印刷する場合"、
if
オプションでさらに圧縮できます:) - @ StevenPenny、
echo Too long
2つの引数(Too
とlong
)をecho
に渡します。echo
出力はスペースで区切られ(その後に改行が続きます)、echo 'Too long'
では、1つのToo long
を渡します。 改行が続くように表示されます。したがって、'は機能的に同等です。
/bin/sh
で正しく機能します。移植性を高めるためにshebang行を#!/bin/sh
に変更することを検討する必要があります。 bashが利用できない環境で実行します'さらに、/bin/sh
は、ダッシュのようなより軽量なシェルである可能性があります'インタラクティブな使用を目的とした機能を負担していません。dash
' s${#string}
は、文字ではなくバイト数で長さを示します。