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

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

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:]]文字列のすべての文字と一致します。

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

おすすめ記事