ユーザー名を検証するためにこれを行っています:
if [[ "$username" =~ ^[a-z][_a-z0-9]{2,17}$ ]]; then
しかし実際には、é、ç、à などの Unicode 文字を含むユーザー名は受け入れられます。文字列を ASCII 文字 (a、b、c、d ... z) のみに制限するには、どの正規表現クラスを使用すればよいですか?
最初の設定でこれを行うことができるはずですLC_ALL=C
(おそらく、他に影響を与えないように一時的に)。より最新の正規表現エンジンでは、アクセント付き文字を基本文字に折りたたむことができるロケールを使用できます (または、少なくとも と の間に来るように順序付けますa
) z
。
C ロケールは ASCII しか認識しないため、これで問題が解決するはずです。
たとえば、次のスクリプトを参照してください。
#!/bin/bash
username=amélie_314159
for locale in '' 'C' ; do
export LC_ALL="${locale}"
printf "LC_ALL set to %-3s: '%s' is " "'$LC_ALL'" "${username}"
if [[ "${username}" =~ ^[a-z][_a-z0-9]{2,17}$ ]] ; then
echo valid
else
echo invalid
fi
done
出力:
LC_ALL set to '' : 'amélie_314159' is valid
LC_ALL set to 'C': 'amélie_314159' is invalid
防弾の方法は、単に次の[a-z]
ように綴ること[abcdefghijklmnopqrstuvwxyz]
です。そこには!1970 年 1 月 1 日 00:00:00 以降、ロケールやおかしな文字クラスをいじらず、どのシェルでもサポートされています。OS ベンダー、シェル ベンダー、Unix 標準化プロセス、または BOFH がクールだと考えているものに関係なく、将来性があります。
lc
次のような追加の変数を使用して
lc=abcdefghijklmnopqrstuvwxyz
正規表現も読み取り可能になります。
[$lc][_0-9$lc]{2,17}
これは、非常に堅牢で移植可能なconfigure
スクリプトが行うことです。