AIXではkshを使用しており、変数(例えばvar1=sanySAN
)がvar2=SANYsa%$3
英数字であることを確認したいと思います。
ここではvar1
代わりに英数字ですvar2
。[a-z][A-Z][0-9]
orを使用できることを知っていますが、[:alnum:]
方法がわかりません。
これを確認する必要がありますか?
if [[ var == [:alnum:]* ]]
then
echo "yes"
else
echo "no"
fi
いくつかの方法を試しましたが失敗しました。
答え1
フロント:
is_alnum() {
case $1 in (*[![:alnum:]]*|"") false;; esac
}
それから:
$ is_alnum 123 && echo yes
yes
$ is_alnum % || echo no
no
mksh
上記の方法を使用して失敗した唯一のシェルです。
また、変数に有効な文字を形成しない一連のバイトが含まれている場合、この方法は機能しません。
yash
有効なUnicode文字としてのみ機能するため、エラーを報告する唯一の文字です。
$ is_alnum $'A\xe9B'
yash: cannot convert the argument `A�B' into a wide character stringyash: the argument is replaced with an empty string
修正する
mksh
R56に追加および変更された文字クラスR56c。
答え2
あなたはできます:
[[ $var = +([[:alnum:]]) ]]
これはAT&T kshおよびベースzsh
の実装では機能しますksh
が、pdksh
kshベースの実装では機能しないようです。これはzsh -o kshglob
(zsh
呼び出し時のようにksh
)またはbash -O extglob
同じことに当てはまります。
+(...)
ksh
ワイルドカードです。1つ以上。[[:alnum:]]
現在のロケールで英数字と見なされる文字(ラテンアルファベットだけでなく、すべてのアルファベット)。
LC_ALL
変数が設定されていないと仮定し、英語の文字と数字に制限するには、次のようにします。
LC_COLLATE=C; [[ $var = +([a-zA-Z0-9]) ]]
そうでない場合:
[[ $var = +([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]) ]]
これ:
LC_ALL=C; [[ $var = +([[:alnum:]]) ]]
文字の意味が変わっても機能するはずです。 ASCII番号に対応するバイトを含む文字(GB18030の£は81 30 84 35でエンコードされています。ここで、30はASCII 0でもある)にはASCII以外のバイト(81 84£など)も含まれるためです。 。 、特定のシステムのすべての文字セットは、すべての英語の英数字を含む移植可能な文字セットの文字エンコーディングに同意する必要があります。
また、UTF-8ロケールでは、ksh93u +(少なくとも)は現在$var
有効な文字を形成していませんが、ISO-8859-1文字セットの数字に対応するバイトシーケンスが含まれている場合にバグがあります。彼らはそのような治療を受けますalnums
。たとえば、$'A\xe9B'
ISO-8859-1では、0xe9はéなので、英数字として扱われます。 (U + 00E9はですが、é
éのUTF-8エンコーディングは0xe9ではなく0xc3 0xa9です。)
答え3
以下に基づいたいくつかのアイデアexpr
:
if expr "x$string" : '.*[^[:alnum:]]' >/dev/null;
then
printf "%s is NOT alphanumeric\n" "$string"
else
printf "%s is alphanumeric\n" "$string"
fi
printf
over は任意の文字列なので、意図echo
的な使用です。"$string"
追加情報ここ。また、先行する「x」は、expr
で始まる項目に展開するときのブロックを防ぎます。コメントを通じてこの回答を改善するのに役立つStéphaneとSatoに感謝します。$string
-
答え4
すべての助けに感謝します。多くの試みの終わりにこの解決策を得ました。
var=`echo "some-value" | tr -d "[:alnum:]"`
if [ "$var" == "" ]; then
echo " string has only alphanumerics"
else
echo "something other than alphanumerals is there"
fi