Shell脚本中的日期变量详解

时间:2025-04-04 21:42:56

????致敬读者

  • ????感谢阅读????笑口常开????生日快乐⬛早点睡觉

????博主相关

  • ????博主信息????博客首页????专栏推荐????活动信息

文章目录

  • Shell脚本中的日期变量详解
    • ???? 基础用法示例
    • ???? 扩展日期格式
    • ⚠️ 注意事项
    • ???? 完整脚本示例
    • ???? 常见错误
    • ???? 调试技巧
    • ???? 高级用法


????文章前言

  • ????文章均为学习工作中整理的笔记。
  • ????如有错误请指正,共同学习进步。

Shell脚本中的日期变量详解

在 Shell 脚本中使用日期变量时,通常需要结合 date 命令动态生成时间戳。以下是常见用法和注意事项:


???? 基础用法示例

#!/bin/sh

# 定义日期变量(格式示例:20240327)
TODAY=$(date +%Y%m%d)

# 构建 Docker 镜像时使用日期标签
docker build -t sb_back:$TODAY .

???? 扩展日期格式

根据需求调整 date 的格式参数:

# 带时间的格式(示例:20240327_153045)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 人类可读格式(示例:2024-03-27)
HUMAN_DATE=$(date +%F)

# 其他自定义格式(示例:27Mar2024)
CUSTOM_DATE=$(date +%d%b%Y)

⚠️ 注意事项

  1. Shell 环境差异

    • 如果使用 #!/bin/sh,确保 date 命令支持你的格式(BSD 和 GNU date 可能有差异)。
    • 如需复杂操作,建议改用 #!/bin/bash
  2. Docker 标签合法性

    • Docker 标签只能包含小写字母、数字、下划线、.-,不能包含空格或特殊字符(如 : 在标签中本身就是分隔符)。
  3. 时区问题

    • 默认使用系统时区,如需指定时区:
      # 使用 UTC 时区(需 GNU date)
      UTC_DATE=$(date -u +%Y%m%d)
      

???? 完整脚本示例

#!/bin/sh

# 生成日期变量
IMAGE_TAG=$(date +%Y%m%d_%H%M%S)

# 构建镜像
docker build -t sb_back:$IMAGE_TAG .

# 可选:同时标记为 latest
docker tag sb_back:$IMAGE_TAG sb_back:latest

???? 常见错误

  1. 语法错误

    # 错误:漏掉 $ 符号或命令替换符
    TODAY=date +%Y%m%d         # ❌
    TODAY=$(date +%Y%m%d)      # ✅
    
  2. 格式冲突

    # 错误:空格未用引号包裹
    docker tag sb_back:$(date +%c)  # ❌ 若日期含空格会报错
    docker tag sb_back:"$(date +%c)"  # ✅ 用引号包裹
    

???? 调试技巧

  1. 先打印变量值

    echo "当前标签:$IMAGE_TAG"
    docker build -t sb_back:$IMAGE_TAG .
    
  2. 检查命令展开

    # 直接替换变量查看最终命令
    set -x  # 开启调试模式
    docker build -t sb_back:$IMAGE_TAG .
    set +x  # 关闭调试模式
    

???? 高级用法

如果需要动态计算日期(如昨天、明天):

# GNU date 用法(Linux 系统)
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
TOMORROW=$(date -d "tomorrow" +%Y%m%d)

# BSD date 用法(macOS 系统)
YESTERDAY=$(date -v-1d +%Y%m%d)
TOMORROW=$(date -v+1d +%Y%m%d)

通过合理使用日期变量,可以让你的脚本更灵活地管理镜像版本! ????


????文末寄语

  • ????关注我,获取更多内容。
  • ????技术动态、实战教程、问题解决方案等内容持续更新中。
  • ????《全栈知识库》技社区,集结全栈各领域开发者,期待你的加入。
  • ????​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • ????点击下方名片获取更多内容????????????????