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 回答