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

Eri*_*ric 2 syntax bash 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
Run Code Online (Sandbox Code Playgroud)

第一个if语句应该测试格式.elif语句应该测试以确保日期是过去的,而不是将来的,甚至是今天.如果它通过了两个测试,那么tDateOkay应该从零变为1,程序应该继续该日期作为未来数据搜索的输入.如果我需要添加任何内容以便清楚,请告诉我.

fed*_*qui 5

我认为你在这一行有一个问题:

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

它适用于我

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

也就是说,把+里面的日期格式.

对于将来,我建议2>&1您在确定代码正常时使用.否则调试会更复杂.

顺便说一下,如删除的答案所述,这if [[ || ]]不是最好的POSIX方式.在这篇评论中,我被建议使用if [ ] || [ ].