2016-08-22 3 views
0

私は何十回もパッチを当てた20年前のコードを使ってプロジェクトを進めています。Linuxテスト用の表現

これまでに見たことのないテストの表現があり、実際に行っていることをどのように分解するのか分かりません。

「YYYYMMDD」または「YYYYMMMDD」の形式の日付変数があります(たとえば、「20160629」または「2016JUN29」)。

テストは次のとおりです。

if [[ $datevar != *[0-9] ]] 
then 
<error notification> 
exit 1 
fi 

は、誰かが '* [0-9]' 表現が何をしているのか説明できますか? AFAICT $ date変数に何が含まれていても、エラー終了は決してありません。日付を生成するコードに基づいて、 'YYYYMMMDD'形式にする必要があります。

このコードはもともとSun Solaris上で動作しましたが、RHEL 6.4ではkshシェルを使用して実行されています。

+3

私は非常にリベラルな検証のようですか? $ datevarに何か(*)がついていて、その後に[0-9]の数字が来たら、おそらくすべてが渡る理由 – sloven

+0

答えを受け入れることができますか? – agilob

答えて

1

我々が言えることは、テストが最後の文字が数字個人的に

$ datevar=20160629 
$ if [[ $datevar != *[0-9] ]] ; then 
    echo caught error 
    fi 
# no output from above 

$ datevar=20160629X 
$ if [[ $datevar != *[0-9] ]] ; then 
    echo caught error 
    fi 
caught error 
$ 

であることを確認されていることですが、私は検証のこの種のためのcaseステートメントを使用して好みます。

case $datevar in 
    2[0-9][0-9][0-9][A-Z][A-Z][A-Z][0-3][0-9]) : nothing_to_do_correct_format ;; 
    *) echo error in format for $datevar ;; 
esac 

これはあなたのアイデアを与えるが、どちらの形式のために解決し、それがAAAZZZに;-)に一致するよう、もちろん、それは、ないトラップ無効月の値をしていません。

それはすべての可能な略語にマッチ作りは私が;-)怖いコンサルティングプロジェクトです

IHTH

1

式が終わりに数字が含まれている、または数字のみの文字ですすべてのものと一致しました。

あなたのケースでは、ステートメントテストがロジックを逆転させた場合。数字で終わらず、数字は最後の文字ではありません。

関連する問題