跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Shell 脚本中 date 命令常用技巧与实战

Shell 脚本处理数据回溯时,date 命令是核心工具。日期格式转换、相对时间计算(如昨天、明天)、参数化日期处理以及连续时间戳生成的实用方法。通过整数比较优化循环逻辑,并提供了分表场景下的 MySQL 操作示例,帮助开发者高效编写定时任务与数据处理脚本。

t ag发布于 2018/11/30更新于 2026/9/859 浏览
Shell 脚本中 date 命令常用技巧与实战

在处理数据时,经常需要根据时间段批量回溯数据。在 Shell 脚本中,熟练运用 date 命令及其格式转化至关重要,特别是面对 20181010 和 2018-10-10 这两种常见格式,掌握几个核心技巧能极大提升效率。

基础日期格式转换

获取当前日期的两种标准格式是最常用的需求。这里要注意不同系统对 -d 参数的支持差异,GNU coreutils 通常支持较好。

date -d today +"%Y%m%d"
date +"%Y%m%d"

如果需要带横杠的格式:

date -d today +"%Y-%m-%d"
date +"%Y-%m-%d"

日期互转与相对时间计算

格式之间的转换非常直接,利用 -d 指定输入字符串,+"%..." 指定输出格式即可。

# 2018-11-01 转 20181101
date -d "2018-11-01" +"%Y%m%d"

# 20181101 转 2018-11-01
date -d "20181101" +"%Y-%m-%d"

处理相对时间也很方便,比如生成今天的前一天和后一天:

date -d "today 1 day ago" +"%Y%m%d"
date -d "today 1 day" +"%Y%m%d"
date -d "today 1 day ago" +"%Y-%m-%d"
date -d "today 1 day" +"%Y-%m-%d"

如果基于变量 ${dt} 计算前一天或后一天:

date -d "${dt} 1 day ago" +"%Y%m%d"
date -d "${dt} 1 day" +
"%Y%m%d"

动态参数与脚本调度

编写定时任务脚本时,通常需要既支持手动指定日期,又能在无参数时使用当前日期。这种写法兼顾了灵活性与自动化。

#!/bin/sh
if [[ $# -eq 1 ]]; then
    dt="${1}"
else
    dt=$(date +"%Y%m%d")
fi

dt_start=$(date -d "${dt}" +"%Y-%m-%d")
dt_end=$(date -d "1 day ${dt_start}" +"%Y-%m-%d")

echo "start druid ingest ${dt_start}"
sh process.sh para1 "${dt_start}" "${dt_end}"
echo "end druid ingest ${dt_start}"

连续时间戳生成逻辑

根据开始和结束时间生成连续的时间戳序列,这在数据回溯场景中非常有用。网上常见的思路是把年月日格式转成时间戳比大小,但更直观的做法是把年月日格式直接转成整数比较。

#!/bin/sh
# $1 是开始时间,$2 是结束时间
startdate=$(date -d "$1" +"%Y%m%d")
tempdate=${startdate}
enddate=$(date -d "$2" +"%Y%m%d")

# 将时间戳转成整数比大小
while [ $((tempdate)) -le $((enddate)) ]; do
    echo $tempdate
    # 20180801
    # echo $(date -d "$tempdate" +"%F")
    # 2018-08-01
    tempdate=$(date -d "1 day $tempdate" +"%Y%m%d")
    # 20180802
done

实际场景:MySQL 分表处理

下面给出一个用于 MySQL 分表的脚本示例。之所以要分到小时级别,是为了防止一次性将内存占满。在指定时间段内生成连续时间戳,并对每天的 24 小时分别处理。

注意:生产环境中请替换为实际的数据库连接信息,切勿硬编码密码。

#!/bin/sh

handleDay() {
    day=$1
    year_month=${day:0:6}
    echo ${year_month}
    
    hours=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
    for i in ${hours[@]}; do
        echo "${i}hour start"
        # 替换为实际连接配置
        mysql -h remote_host -u user -p password -D database_name -e "insert into table_${year_month} select * from table_ori where day=${day} and hour=${i}"
        sleep 3
    done
}

# 主函数:$1 是开始时间,$2 是结束时间
startdate=$(date -d "$1" +"%Y%m%d")
tempdate=${startdate}
enddate=$(date -d "$2" +"%Y%m%d")

while [ $((tempdate)) -le $((enddate)) ]; do
    echo $tempdate
    handleDay ${tempdate}
    tempdate=$(date -d "1 day $tempdate" +"%Y%m%d")
done

只取年月部分

有时候只需要年份和月份,例如 201810。同样可以通过判断参数是否存在来决定使用传入值还是当前时间。

#!/bin/sh
if [ ! -z "$1" ]; then
    current_month=$1
else
    current_month=$(date -d today +"%Y%m")
fi

以上这些技巧涵盖了日常数据处理中最常见的日期操作场景。在实际编写脚本时,记得处理好引号引用和变量扩展,避免因为空格或特殊字符导致脚本报错。

目录

  1. 基础日期格式转换
  2. 日期互转与相对时间计算
  3. 2018-11-01 转 20181101
  4. 20181101 转 2018-11-01
  5. 动态参数与脚本调度
  6. 连续时间戳生成逻辑
  7. $1 是开始时间,$2 是结束时间
  8. 将时间戳转成整数比大小
  9. 实际场景:MySQL 分表处理
  10. 主函数:$1 是开始时间,$2 是结束时间
  11. 只取年月部分

更多推荐文章

查看全部
  • DeepSeek + 通义万相高效制作 AI 视频实战详解
  • 大模型私有化部署与精调技术详解
  • VS Code 远程调用 Claude Agent 报错“无效请求”的配置修正
  • 二分算法实战:查找元素首尾位置与区间计数
  • 前端面试题 JavaScript 核心知识点详解
  • Python 与大模型结合实现网页数据爬虫实战
  • 2026 年求职指南:纯 LLM、多模态大模型与 AIGC 赛道对比
  • Node.js 下载安装及环境配置教程
  • 2024 年常用网络资源镜像站实测与使用指南
  • 企业微信群机器人发送 Markdown 消息支持表格及艾特功能
  • 企业级 RAG 应用的 5 大技术发展趋势
  • C# 创建 WebApi 教程:从 Minimal API 到数据库集成
  • 2026 年协作机器人十大品牌盘点
  • Spring AI MCP Server 集成与使用指南
  • 基于 Docling、Ollama、Phi-4 与 ExtractThinker 的企业级文档智能处理方案
  • AI 产品经理转型指南:核心能力与行业认知
  • OpenClaw 安装 + 接入飞书机器人完整教程
  • 在 Cursor 中使用 MCP 服务详解
  • Git 三阶段模型:工作目录、暂存区与本地仓库
  • 大模型技术从基础入门到实战应用指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online