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