bash 脚本读取用户输入并使用“cal”命令来验证日期

bash 脚本读取用户输入并使用“cal”命令来验证日期

我想编写一个读取我的输入的脚本(例如,如果我的脚本称为“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

笔记:

  • 我用的是shell自带的算术展开验证输入/删除前导零,而不是bc为每个参数创建一个新进程
  • 我在用GNU 日期解析输入日期
  • date命令可以直接用作if条件表达式。 if通过检查进程退出代码来工作。通常使用[[[可执行文件来代替,但是如果其他程序以有用的退出代码退出,则没有理由可以使用它们
  • 我不确定您是否真的想要cal正确日期的输出。如果这样做,只需取消注释该cal行即可。

答案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
  ...

希望我的问题是正确的,这对某人有帮助。当然对我有用:)

相关内容