我想编写一个读取我的输入的脚本(例如,如果我的脚本称为“check”,那么我会键入“check 9 4 1993”,该输入将通过 cal 命令并通过日历检查是否是是否有效日期)。
我的想法是,如果通过 cal 命令的输入给出错误,则意味着它不是有效日期,反之亦然,如果没有错误则日期有效。我确实意识到这个草案有一些严重的错误(我不知道如何制作它以便我的输入将通过 cal 命令),但我会感谢一些建议。无论如何,这是草稿:
#!/bin/bash
day=$1; month=$2; year=$3
day=$(echo "$day" | bc)
month=$(echo "$month" | bc)
year=$(echo "$year" | bc)
cal $day $ month $year 2> /dev/null
if [[$? -eq 0 ]]; then
echo "This is a valid date"
else
echo "This is an invalid date"
fi
答案1
在我检查过的一些 Linux 发行版中(例如 Ubuntu 14.04),打包cal
来自 BSD 而不是 GNU Coreutils。 BSD版本似乎不接受days作为参数;只有几个月和几年。 Ubuntu 版本确实有一个 -H YYYY-MM-DD 选项,但这似乎没有帮助。
相反,我会使用该date
实用程序。假设 Linux 下的 GNU Coreutils 我想我会重写你的脚本,如下所示:
#!/bin/bash
day=$((10#$1))
month=$((10#$2))
year=$((10#$3))
if date -d $year-$month-$day > /dev/null 2>&1; then
# cal $month $year
echo "This is a valid date"
else
echo "This is an invalid date"
fi
笔记:
答案2
[[
实际上是一个命令,与其他命令一样,您需要空格来分隔其参数:
if [[ $? -eq 0 ]]; then
# ...^
答案3
$
您的美元和变量之间有一个空格month
:
cal $day $ month $year 2> /dev/null
它应该是:
cal $day $month $year 2> /dev/null
答案4
如果您输入格式为“%Y-%m-%d”或“%m/%d/&Y”的日期(例如 2020-11-29 或 11/29/2020),您可以使用 gnu 检查日期有效性日期(gdate)像这样:
gdate -d "$1" +'%Y-%m-%d' > /dev/null 2>&1 # don't display any output
status=$(echo $?) # get error code
if [[ $status = 1 ]] # if date is invalid
then
{ echo "This date doesn't exist. Enter valid date!"; exit 1; }
else
...
希望我的问题是正确的,这对某人有帮助。当然对我有用:)