Bash中的多个测试[[表达式]]

时间:2013-05-08 13:44:17

标签: bash syntax operators

我昨天问了一个问题,试图确保日期格式正确。这稍微有针对性,因为我试图自己编写测试并且它没有按照我的预期行事。 (我是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,程序应该继续该日期作为未来数据搜索的输入。如果我需要添加任何内容以便清楚,请告诉我。

1 个答案:

答案 0 :(得分: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方式。在this comment我建议使用if [ ] || [ ]