0

この条件付き正規表現で何が間違っていたのか分かりますか?

MIN="30"

if ! [[ "$MIN" =~ [0-5]?[0-9]|\* ]]; then
  echo "INVALID MINUTE"
else
  echo "VALID MINUTE"
fi

ありがとう

* アップデート *

ワイルドカードの一致が含まれていませんでした。時間、月(より複雑)、曜日など、満たす必要がある他の条件があるため、純粋な正規表現を使用してこれを行う必要があります。

[1-2]?[0-9]|\* - This is for hour
[1-3]?[0-9]|\* - This is for day of month
1?[0-9]|\*     - This is for month of year 
[0-7]|\*       - This is for day of week (0 = sunday etc)

つまり、分は 1 位と 2 位の保持者の数字である必要があります。または、可能なすべての分に一致するようにワイルドカードにすることもできます 0 - 59

実際、今見てみると、誰かが有効な日ではない 39 を入力する可能性があるため、このソリューションは月の日には機能しません。

* アップデート *

最初はあなたの論理に完全には従っていませんでしたが、あなたは何かを理解していると思います。これは実際に機能する可能性があり、より簡単になります。私は物事を複雑にするのが好きです...

if ! [[ "$MIN" -gt 0 && "$MIN" -lt 59 || "$MIN" == "\*" ]]; then

ワイルドカードを文字通り評価する(よく比較する)のに問題があります。

ここに何か考えがあります。とりあえずググる。

* アップデート *

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then

もう一度テストして、構文を確認しました。MIN が 0 から 59 の間の場合はうまく機能し (true)、MIN が 59 を超える場合も機能します (false を報告します)。ただし、MIN を * に設定しようとするとすぐに、IF ステートメントがフリークしてポップアウトします。

line 340: [: *: integer expression expected
4

2 に答える 2

1

条件を二重に否定していると思いますが、数値演算子だけを使用することも検討しましたか?

min="30"

if ! [[ "$min" -gt 0 && "$min" -lt 59 ]]; then
  echo "INVALID MINUTE"
else
  echo "VALID MINUTE"
fi
于 2013-08-04T07:50:21.747 に答える
0

あなたの問題は(UPDで説明されているように)1つの条件付き文字列で変数を文字列と整数の両方と比較できなかったことです。

最初に文字列 (* 記号)evalと比較してから、整数と比較することをお勧めします。

MIN="*"; #try also other MIN values

k=0; # flag. 1 - if valid, 0 - if invalid

if [ "$MIN" == "*" ]; then
    k=1;
else
    eval "MIN=$MIN";
    if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ]; then
        k=1;
    fi;
fi;

if [ $k -eq 0 ]
    echo "INVALID MINUTE"
else
    echo "VALID MINUTE"
fi
于 2016-03-07T17:47:44.940 に答える