cal 是 Linux 系統內建的日曆查看工具,支援公曆 (格里曆) 顯示,參數豐富,適合終端快速查閱、腳本嵌入與日期計算。本文全面解析 cal 語法、參數、實戰範例與進階應用技巧。
cal [選項] [[月份] 年份]
| 參數 | 功能 | 範例 |
|---|---|---|
-1 | 顯示單月 (預設行為) | cal -1 |
-3 | 顯示上月、本月、下月三個月 | cal -3 |
-s | 週日為每週第一天 (美式預設) | cal -s |
-m | 週一為每週第一天 (ISO 8601/歐式) | cal -m |
-j | 顯示一年中的第幾天 (儒略日格式,1月1日為1) | cal -j |
-y | 顯示指定年份完整日曆 | cal -y 2024 |
-V | 顯示版本資訊 | cal -V |
| 需求 | 命令 | 輸出說明 |
|---|---|---|
| 當月日曆 | cal | 高亮當天 (若終端支援) |
| 指定月份 (2024 年 9 月) | cal 9 2024 | 或 cal 09 2024 |
| 指定年份全年 | cal 2024 或 cal -y 2024 | 12 個月網格排列 |
| 三個月連續顯示 | cal -3 | 上月、本月、下月 |
| 週一為首日 (中文習慣) | cal -m | ISO 週制 |
| 查看今天是第幾天 | cal -j | 如 3月18日 → 78 (非閏年) |
| 指定月份儒略日 | cal -j 9 2024 | 顯示 9 月每日對應年積日 |
#!/bin/bash
# get_days_in_month.sh
MONTH=$1
YEAR=$2
# cal 輸出最後一行即為該月最後幾天,取最後一個數字
cal $MONTH $YEAR | awk 'NF {last=$NF} END {print last}'
# 用法:./get_days_in_month.sh 2 2024 → 29 (閏年)
ncal -w # 顯示週數 (ISO 週號)
ncal -M # 週一為首日
ncal -b # 高亮當天 (需終端支援)
ncal -3 # 三個月
# ncal 輸出為直向排列,適合窄終端
# 取得下個月第一天日期
date -d "$(date +%Y-%m-01) +1 month" +%Y-%m-%d
# 取得本月剩餘天數
DAYS_IN_MONTH=$(cal | awk 'NF {last=$NF} END {print last}')
DAY_NOW=$(date +%d)
echo $((DAYS_IN_MONTH - DAY_NOW))
# 中文顯示
LANG=zh_CN.UTF-8 cal 9 2024
# 輸出:九月 2024 / 日 一 二 三 四 五 六
# 英文顯示
LANG=en_US.UTF-8 cal 9 2024
# 輸出:September 2024 / Su Mo Tu We Th Fr Sa
| 命令 | 特色 | 適用場景 |
|---|---|---|
cal | 傳統、橫向月曆、輕量 | 快速查閱、腳本嵌入 |
ncal | 直向排列、支援週號、高亮 | 窄終端、需要週數 |
date | 單一日期資訊、格式化、運算 | 時間戳、格式轉換、計算 |
| 現象 | 原因/解決 |
|---|---|
| 年份超出 1-9999 報錯 | cal 僅支援 1-9999 年,超出請用 date 計算 |
| 月份參數 0 或 13 報錯 | 月份範圍 1-12 |
| 輸出亂碼 | 終端編碼與 LANG 不匹配,設定 export LANG=en_US.UTF-8 |
| 無法高亮當天 | 傳統 cal 不支援高亮,改用 ncal -b 或 cal | grep --color -E \"(^| )$(date +%e)( |$)\" |
cal 雖小,參數組合靈活,配合 date、awk 即可構建強大的日期處理單行腳本,是 Shell 程式設計師工具箱中的利器。
CentOS 6.4 部署 GlusterFS 分布式存儲:從安裝到多節點複製卷實戰
Ubuntu 12.04 安裝 XScreenSaver 取代預設螢幕保護程式
Ubuntu 13.10 VirtualBox 無法啟動解決方案:Kernel Driver 錯誤、DKMS 重編譯、Kernel Headers 安裝
Ubuntu 14.04 不支持 exFAT 格式 U 盤?一鍵安裝 exfat-utils 解決
Linux vi 編輯器 E325 ATTENTION 交換檔衝突解決:識別衝突來源、恢復內容、清理 .swp 檔案
RedHat Linux 5 ifconfig 指令找不到解決方案:PATH 環境變數缺失 /sbin 路徑