2

昨日、日付が正しくフォーマットされていることを確認する方法について質問しました。自分でテストを作成しようとしたため、これはもう少し的を絞ったものであり、期待どおりに動作していません。(私はLinuxが初めてなので、これはかなりの量です)

YYYYMMDD として入力された日付が必要です。if文の冒頭は基本的に[[$tDateがゼロ文字列かどうか、日付がYYYYMMDDでないかどうかをチェックする]]をチェックするべきだと思います。

コードを実行すると、日付は $lastCOB (昨日、最終営業日) になりますが、日付を入力すると (または日付を変更しないと)、「Invalid date. Please enter the correct format.」が表示されます。つまり、明らかに、テストは形式が正しいとは信じていませんが、希望どおりに YYYYMMDD として入力されています。

tDate=$(lastCOB)
tDateOkay=0

until [[ $tDateOkay -eq 1 ]] ; do
        echo "$tDate"
        echo "$tDateOkay"
        read -p "Please Enter date for search.  Use format: Date (YYYYMMDD): " -e -i  "$tDate" tDate
        if [[ -z "$tDate" || "$(date --date=$tDate + '%Y%m%d' 2>&1 )" != $tDate ]] ; then
                echo "Invalid date. Please enter date in the correct format."
        elif [[ $tDate -gt $(today) || $tDate -eq $(today) ]] ; then
                echo "Date must be in the past.  Please try again."
        else
                tDateOkay=1
        fi
done

最初の if ステートメントは、フォーマットをテストする必要があります。elif ステートメントは、日付が未来ではなく、今日でもないことを確認するためにテストする必要があります。両方のテストに合格した場合、tDateOkay はゼロから 1 に変わり、プログラムはその日付を将来のデータ検索の入力として使用する必要があります。明確にするために何か追加する必要がある場合はお知らせください。

4

1 に答える 1

5

この行に問題があると思います:

if [[ -z "$tDate" || "$(date --date=$tDate + '%Y%m%d' 2>&1 )" != $tDate ]] ; then

それは私に働きます

if [[ -z "$tDate" || "$(date --date=$tDate '+%Y%m%d' 2>&1 )" != $tDate ]] ; then

つまり+、日付形式の中に入れます。

今後は2>&1、コードに問題がないことがわかっている場合に使用することをお勧めします。そうしないと、デバッグがより複雑になります。

ちなみに、削除された回答で述べられているように、これはif [[ || ]]POSIXの最良の方法ではありません。このコメントでは、使用することをお勧めしましたif [ ] || [ ]

于 2013-05-08T13:54:08.027 に答える