kshに入力された変数が英数字であることを確認するには?

kshに入力された変数が英数字であることを確認するには?

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

修正する

mkshR56に追加および変更された文字クラスR56c

答え2

あなたはできます:

[[ $var = +([[:alnum:]]) ]]

これはAT&T kshおよびベースzshの実装では機能しますkshが、pdkshkshベースの実装では機能しないようです。これはzsh -o kshglobzsh呼び出し時のように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

printfover は任意の文字列なので、意図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

関連情報