変数に文字と数字の両方が含まれているかどうかを確認する方法

変数に文字と数字の両方が含まれているかどうかを確認する方法

STRLinuxでシェルスクリプトを確認し、「文字のみ」が含まれているか「数字のみ」が含まれている場合は終了しようとします。数字と文字の両方が含まれている場合はSTR合格する必要があります。特殊文字は含まれません。

似たようなことを試していますが、部分的にしか機能しません。

#!/bin/sh

STR=$1

if [[ ! $STR =~ ^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$ ]]; then
    echo "The input must contain both digits and alphabets like abc123"
    exit 1
fi

echo "Success"
exit 0

小切手が部分的に有効です。つまり、STR数字のみが含まれています。しかし、STRすべての文字が含まれている場合は動作しません。文字と数字(たとえば、または)が含まれている場合にのみ実行したくありませんexit 1STRabc123ABC123

STR含まれていると検査は失敗しますabc

STR含まれている場合にabcのみチェックが機能するようにするにはどうすればよいですか?STR123

答え1

ここでは複雑な正規表現を使用する必要はありません。 2つの条件があるので、2つのテストを使用してください。

if [[ $str == *[[:digit:]]* ]] &&
   [[ $str == *[[:alpha:]]* ]]
then
    printf '"%s" contains both letters and digits\n' "$str"
else
    printf '"%s" lacks either letters or digits\n' "$str"
fi

「特殊文字」も言及しましたが、その文字が何であるかを指定しませんでした。文字を[[:punct:]]次のように一致させることを意味するとします。いいえこれを文字列にしたい場合は、次のものを使用できます。

if [[ $str == *[[:digit:]]* ]] &&
   [[ $str == *[[:alpha:]]* ]] &&
   [[ $str != *[[:punct:]]* ]]
then
    printf '"%s" contains both letters and digits, and no specials\n' "$str"
else
    printf '"%s" lacks either letters or digits, or contains specials\n' "$str"
fi

[[:punct:]]文字列のすべての文字と一致します。

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

答え2

正規表現は文字も一致するため、^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$数字だけを確認しません。のサブセットである必要があるため、パターンは完全に英数字で、1つ以上の文字を含むすべての文字列と一致します。[:alnum:][:alpha:][:alnum:]

(通常のグリディマッチングを仮定すると、入力が一致するとabcd最後の項目が一致し、最後の項目は何も一致しません。)abc[[:alnum:]]*d[[:alpha:]][[:alnum:]]*

文字列に少なくとも1つの文字と1つの数字が含まれていることを確認するには、test[[:alpha:]]と次の2つのテストに分割する方が簡単です[[:digit:]]

if [[ $str =~ [[:alpha:]] && $str =~ [[:digit:]] ]]; then
    echo "contains a letter and a digit"

句読点などの他の内容を含む文字列も拒否するには、次のチェックマークを追加します。

if [[ $str =~ [[:alpha:]] && $str =~ [[:digit:]] && ! $str =~ [^[:alnum:]] ]]; then
    echo "contains a letter and a digit, but no non-alphanumerics"

!失敗したケースを見つけるには、最初からテスト全体を逆にしてください()if ! [[ ...

(正規表現でこれを行うには、次のように使用できます。
^([[:alnum:]]*[[:alpha:]][[:alnum:]]*[[:digit:]][[:alnum:]]*|[[:alnum:]]*[[:digit:]][[:alnum:]]*[[:alpha:]][[:alnum:]]*)$ しかし、少し怖いです。)

答え3

もっと簡単にしてみてください。質問を2つの部分に分けます。

...
if [[ $STR =~ ([a-zA-Z]+) && $STR =~ ([0-9]+) ]]; then 
...

関連情報