本文将帮助理解如何在 Bash 脚本中使用 date 命令,如何在 shell 脚本中使用 date 命令处理日期和时间,如何在 Linux 中操作它们并使用它进行各种操作。
您应该对如何设置系统日期和时间有一个基本的了解,这部分主要由服务器管理员在您的工作中处理。
但是,如果您是个人用户并且在您的个人计算机中使用 Linux,那么您应该了解如何设置日期和时间、同步它们的方法以及如何修改它。
Linux 使用两个时钟来保持时间同步:
- 实时时钟:这是集成到系统主板中的时钟,即使您关闭机器也会运行。
- 系统时钟-:这将由 Linux 内核处理,并且在系统引导期间内核将从实时时钟获取初始时间。
我不会经历设置日期和时间的过程,这是一个单独的话题来讨论,让我们开始研究本文的核心部分,了解如何date在 Linux 中使用 Bash 脚本中的命令。
获得帮助
date首先,您可以通过运行以下命令来检查命令的二进制位置。
$ which date
/usr/bin/date
该date命令不是内置的 shell,而是外部程序。您可以通过运行type命令获取该信息。
$ type -a date
date is /usr/bin/date
date is /bin/date
有很多选项可以使用,记住所有内容是不可能的,这就是帮助和手册页派上用场的地方。
运行以下命令以访问命令的手册页date。
$ man date
运行以下命令以访问帮助消息。
$ date --help
打印当前日期和时间
启动您的终端并简单地运行date命令。您将获得当前日期以及时间和时区。就我而言,我在安装操作系统期间将时区设置为IST 。
$ date
Sunday 13 February 2022 11:27:17 AM IST
您还可以使用该标志获取UTC时区的日期和时间。-u
$ date -u
Sunday 13 February 2022 05:57:36 AM UTC
时区转换
您可以date通过设置环境变量TZ来获取不同时区的命令输出。在下面的示例中,我已将 TZ 设置为莫斯科和新加坡时区。
$ Z="Europe/Moscow" date
Sunday 13 February 2022 08:59:03 AM MSK
$ TZ="Asia/Singapore" date
Sunday 13 February 2022 01:59:37 PM +08
您可以通过运行“ timedatectl”命令获取时区列表。
$ timedatectl list-timezones
$ timedatectl list-timezones | grep -i singapore
Asia/Singapore
Singapore
$ timedatectl list-timezones | grep -i moscow
Europe/Moscow
文件的最后修改时间
通常,我们使用stat命令来检查文件的修改时间。可以通过使用标志的date命令进行检查。-r
$ stat ~/.bashrc
File: /home/karthick/.bashrc
Size: 4342 Blocks: 16 IO Block: 4096 regular file
Device: 806h/2054d Inode: 27787278 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/karthick) Gid: ( 1000/karthick)
Access: 2022-02-13 09:06:45.713721080 +0530
Modify: 2022-02-11 20:18:52.485178931 +0530
Change: 2022-02-11 20:18:52.485178931 +0530
Birth: -
$ date -r ~/.bashrc
Friday 11 February 2022 08:18:52 PM IST
您可以看到stat命令输出格式与date命令不同,但两者的目的相同。
不同的格式选项
该date命令支持格式化选项,使用这些选项,您可以将date命令输出格式化为您想要的任何格式,或者您可以仅从输出中获取特定值。
打开date命令的手册页并查找如下图所示的部分。

有很多格式化选项,但并非所有选项都有用。我们将看到一些重要的格式化选项并了解它是如何工作的。
默认情况下,该date命令将显示日期和时间。如果您只想打印日期或时间怎么办?
$ date
Sunday 13 February 2022 11:27:17 AM IST
要仅获取日期,您可以使用%Fflag 或%Dflag。
$ date +%F
2021-11-16
$ date +%D
02/13/22
当您使用格式化程序标志时,您应该+像我在上面的示例中那样使用符号作为前缀。
- 标志的输出%F将采用YYYY-MM-DD格式。
- 标志的输出%D将采用MM/DD/YY格式。
您可以单独获取日、月和年,并创建自己的新格式输出。
$ date +%Y
2022
$ date +%m
02
$ date +%d
13
要创建您自己的格式化输出,只需组合如下所示的所有标志。
$ date +%Y_%m_%d
2022_02_13
与日期类似,您也可以使用%r(12 小时格式)或%T(24 小时格式)标志单独获取时间。
$ date +%r # 12 hour format
11:24:12 PM IST
$ date +%T # 24 hour format
23:24:11
您可以单独获取小时、分钟、秒并创建自己的格式化输出。
$ date +%H
12
$ date +%M
24
$ date +%S
03
结合上述所有标志并创建自定义输出。
$ date +%H_%M_%S
12_26_53
现在这些自定义格式选项在哪里有帮助?对我来说,当我创建任何文件作为脚本的一部分时,我会用今天的日期命名它。因此,在需要时查看它对我很有用。
到目前为止,我们已经了解了如何单独处理日期和时间。有时,您可能希望同时显示日期和时间。在这种情况下,您可以像下面那样组合日期和时间,或者创建自己的格式化输出。
$ date "+%F %r"
2021-11-16 11:29:06 PM IST
仅在特定日期运行脚本
在某些情况下,您可能只想在一周中的某一天运行脚本。例如,如果我希望我的脚本仅在星期五运行,那么我可以使用%A(Friday) 或%a(Fri) 标志并相应地编写逻辑。
if [[ $(date +%A) = Friday ]]
then
echo "Running the code"
else
echo "Today is not Friday, Exiting the script"
fi
OUTPUT:
Today is not Friday, Exiting the script
有更多可用的格式选项。请参阅手册页并浏览它们。
将输出存储到变量
编写脚本时,最好将date命令的输出存储到一个变量中并在脚本中使用该变量。一种这样的情况是创建带有日期和时间的文件名。
看看下面的例子,今天的日期将存储在变量TDY中,同样用于创建一个文件名“ disk_usage_${TDY}.txt”,该文件名将存储“ df -h”命令的输出。
$ TDY=$(date +%F)
$ df -h > ~/disk_usage_${TDY}.txt
$ ls -l *.txt-rw-rw-r-- 1 karthick karthick 474 Feb 13 23:40 disk_usage_2022-02-13.txt
$ cat disk_usage_2022-02-13.txt
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 154M 1.5G 10% /run
/dev/sda7 93G 27G 61G 31% /
tmpfs 7.8G 82M 7.7G 2% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/sda9 261G 130G 118G 53% /nextdrive
/dev/sda6 348G 110G 221G 34% /home
/dev/sda5 2.0G 234M 1.8G 12% /boot/efi
tmpfs 1.6G 180K 1.6G 1% /run/user/1000
使用-d或–date标记
这是我最喜欢该date命令的一个重要功能。您可以将字符串作为参数传递给-d或–date标志,您将获得默认格式的输出。
看看下面的例子。我已将字符串参数作为“ today”、“ yesterday”、“ tomorrow”、“ last Thursday”、“ Today (+,-) 20 years”传递给–date标志。Date 命令将解释这些字符串并将输出转换为其默认格式。
$ date --date "Today"
Sunday 13 February 2022 01:01:26 PM IST
$ date --date "now"
Sunday 13 February 2022 01:01:34 PM IST
$ date --date "yesterday"
Saturday 12 February 2022 01:01:39 PM IST
$ date --date "Tomorrow"
Monday 14 February 2022 01:01:45 PM IST
$ date --date "Last Thursday"
Thursday 10 February 2022 12:00:00 AM IST
$ date --date "Today - 20 years"
Wednesday 13 February 2002 01:01:56 PM IST
$ date --date "Today + 20 years"
Thursday 13 February 2042 01:02:01 PM IST
除了我在上面的示例中显示的内容之外,您还可以传递更多的相对字符串参数。
纪元时间
纪元时间可以使用-dor–date标志转换为当前日期和时间格式。%s标志输出将采用纪元格式。
$ date +%s
1644737777
要将其转换为标准的人类可读格式,请添加@后跟纪元时间,如下所示。
$ date --date @1644737777
Sunday 13 February 2022 01:06:17 PM IST
在上述所有示例中,您可以看到显示的是默认输出,您可以将格式化程序与-dor–date标志结合起来以获得自定义输出。
$ date --date "Today + 20 years" +%Y
2042
$ date --date "Today + 21 years" +%s
2275890194
$ date --date @2275890194 +%Y
2042
结论
在本文中,我们date通过示例讨论了如何在 Bash 脚本中使用该命令,此时,您应该可以在date脚本中使用该命令了,有很多可用的格式化选项,测试并熟悉它们。
暂无评论内容