STR
Linuxでシェルスクリプトを確認し、「文字のみ」が含まれているか「数字のみ」が含まれている場合は終了しようとします。数字と文字の両方が含まれている場合は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 1
。STR
abc123
ABC123
STR
含まれていると検査は失敗しますabc
。
STR
含まれている場合にabc
のみチェックが機能するようにするにはどうすればよいですか?STR
123
答え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
...