本文目录导读:

我来帮你编写一个闹钟管理脚本,这里提供Python和Shell两种版本:
Python版本(推荐)
#!/usr/bin/env python3
"""
闹钟管理脚本
功能:设置、查看、删除闹钟,支持多种闹钟类型
"""
import json
import os
import time
import threading
import platform
import subprocess
from datetime import datetime, timedelta
from pathlib import Path
class AlarmManager:
def __init__(self, storage_file="alarms.json"):
self.storage_file = Path(storage_file)
self.alarms = self.load_alarms()
self.running = False
def load_alarms(self):
"""加载闹钟数据"""
if self.storage_file.exists():
try:
with open(self.storage_file, 'r') as f:
return json.load(f)
except json.JSONDecodeError:
print("警告:闹钟文件损坏,将创建新的闹钟列表")
return []
def save_alarms(self):
"""保存闹钟数据"""
with open(self.storage_file, 'w') as f:
json.dump(self.alarms, f, indent=2, ensure_ascii=False)
def add_alarm(self, time_str, message="起床啦!", repeat=False, sound=True):
"""添加闹钟
time_str: 时间字符串,格式 HH:MM
message: 闹钟消息
repeat: 是否重复(每天)
sound: 是否播放声音
"""
try:
# 验证时间格式
alarm_time = datetime.strptime(time_str, "%H:%M")
alarm = {
"id": len(self.alarms) + 1,
"time": time_str,
"message": message,
"repeat": repeat,
"sound": sound,
"enabled": True,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.alarms.append(alarm)
self.save_alarms()
print(f"✅ 闹钟已添加:{time_str} - {message}")
return True
except ValueError:
print("❌ 时间格式错误,请使用 HH:MM 格式(如 07:30)")
return False
def list_alarms(self):
"""列出所有闹钟"""
if not self.alarms:
print("📋 暂无闹钟")
return
print("\n📋 闹钟列表:")
print("-" * 50)
for alarm in self.alarms:
status = "🟢" if alarm["enabled"] else "🔴"
repeat_mark = "🔁" if alarm["repeat"] else "🔂"
sound_mark = "🔊" if alarm["sound"] else "🔇"
print(f"{status} ID:{alarm['id']} | {alarm['time']} | {alarm['message']} | {repeat_mark}{sound_mark}")
print("-" * 50)
def delete_alarm(self, alarm_id):
"""删除闹钟"""
for i, alarm in enumerate(self.alarms):
if alarm["id"] == alarm_id:
self.alarms.pop(i)
self.save_alarms()
print(f"🗑️ 闹钟 {alarm_id} 已删除")
return True
print(f"❌ 未找到 ID 为 {alarm_id} 的闹钟")
return False
def toggle_alarm(self, alarm_id):
"""启用/禁用闹钟"""
for alarm in self.alarms:
if alarm["id"] == alarm_id:
alarm["enabled"] = not alarm["enabled"]
self.save_alarms()
status = "启用" if alarm["enabled"] else "禁用"
print(f"🔄 闹钟 {alarm_id} 已{status}")
return True
print(f"❌ 未找到 ID 为 {alarm_id} 的闹钟")
return False
def play_sound(self):
"""播放声音"""
system = platform.system().lower()
try:
if system == "darwin": # macOS
subprocess.run(["afplay", "/System/Library/Sounds/Submarine.aiff"],
timeout=5)
elif system == "linux":
# 尝试多种方式播放声音
try:
subprocess.run(["paplay", "/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga"],
timeout=5)
except:
# 使用系统蜂鸣声
print('\a')
elif system == "windows":
import winsound
winsound.Beep(1000, 500) # 频率1000Hz,持续500ms
except Exception as e:
print(f"⚠️ 播放声音失败:{e}")
def check_alarms(self):
"""检查闹钟是否到时间"""
while self.running:
now = datetime.now()
current_time = now.strftime("%H:%M")
for alarm in self.alarms:
if not alarm["enabled"]:
continue
if alarm["time"] == current_time:
print(f"\n⏰ 闹钟时间到!ID:{alarm['id']} - {alarm['message']}")
if alarm["sound"]:
self.play_sound()
# 如果不是重复闹钟,自动禁用
if not alarm["repeat"]:
alarm["enabled"] = False
self.save_alarms()
# 每30秒检查一次
time.sleep(30)
def start(self):
"""启动闹钟监控"""
if self.alarms:
print("🚀 闹钟监控已启动")
self.running = True
thread = threading.Thread(target=self.check_alarms, daemon=True)
thread.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
self.stop()
else:
print("📋 没有闹钟需要监控")
def stop(self):
"""停止闹钟监控"""
self.running = False
print("\n🛑 闹钟监控已停止")
def main():
"""主函数"""
manager = AlarmManager()
print("=" * 50)
print("⏰ 闹钟管理脚本")
print("=" * 50)
while True:
print("\n📌 命令菜单:")
print("1. 添加闹钟")
print("2. 查看闹钟")
print("3. 删除闹钟")
print("4. 启用/禁用闹钟")
print("5. 启动监控")
print("6. 退出")
choice = input("\n请输入选择 (1-6): ").strip()
if choice == "1":
time_str = input("请输入时间 (HH:MM): ").strip()
message = input("请输入提醒信息 (默认: 起床啦!): ").strip() or "起床啦!"
repeat = input("是否每天重复?(y/n, 默认: n): ").strip().lower() == "y"
sound = input("是否播放声音?(y/n, 默认: y): ").strip().lower() != "n"
manager.add_alarm(time_str, message, repeat, sound)
elif choice == "2":
manager.list_alarms()
elif choice == "3":
manager.list_alarms()
try:
alarm_id = int(input("请输入要删除的闹钟ID: "))
manager.delete_alarm(alarm_id)
except ValueError:
print("❌ 请输入有效的ID")
elif choice == "4":
manager.list_alarms()
try:
alarm_id = int(input("请输入要切换状态的闹钟ID: "))
manager.toggle_alarm(alarm_id)
except ValueError:
print("❌ 请输入有效的ID")
elif choice == "5":
manager.start()
elif choice == "6":
print("👋 再见!")
break
else:
print("❌ 无效选择,请重新输入")
if __name__ == "__main__":
main()
Shell版本(简单任务提醒)
#!/bin/bash
# alarm.sh - 简单的闹钟脚本
# 闹钟存储文件
ALARM_FILE="$HOME/.alarms.json"
# 添加闹钟
add_alarm() {
local time=$1
local message=$2
# 时间格式验证
if [[ ! $time =~ ^[0-9]{2}:[0-9]{2}$ ]]; then
echo "❌ 时间格式错误,请使用 HH:MM 格式"
return 1
fi
# 创建JSON格式闹钟
local alarm="{\"time\":\"$time\",\"message\":\"$message\",\"enabled\":true}"
# 存储闹钟
if [ -f "$ALARM_FILE" ]; then
# 在现有关闭括号前插入新闹钟
sed -i 's/]/ ,'$alarm'\n]/' "$ALARM_FILE"
else
echo "[$alarm]" > "$ALARM_FILE"
fi
echo "✅ 闹钟已添加:$time - $message"
}
# 查看闹钟
list_alarms() {
if [ ! -f "$ALARM_FILE" ]; then
echo "📋 暂无闹钟"
return
fi
echo "📋 闹钟列表:"
cat "$ALARM_FILE" | python3 -c "
import json, sys
try:
alarms = json.load(sys.stdin)
for i, alarm in enumerate(alarms, 1):
status = '🟢' if alarm.get('enabled', True) else '🔴'
print(f'{status} {i}. {alarm[\"time\"]} - {alarm[\"message\"]}')
except:
print('读取闹钟失败')
"
}
# 删除闹钟
delete_alarm() {
local id=$1
python3 -c "
import json
with open('$ALARM_FILE', 'r') as f:
alarms = json.load(f)
if 1 <= $id <= len(alarms):
deleted = alarms.pop($id - 1)
with open('$ALARM_FILE', 'w') as f:
json.dump(alarms, f, indent=2)
print(f'✅ 闹钟已删除: {deleted[\"time\"]} - {deleted[\"message\"]}')
else:
print('❌ 无效ID')
"
}
# 监控闹钟
monitor_alarms() {
echo "🚀 闹钟监控已启动 (按 Ctrl+C 停止)"
while true; do
if [ -f "$ALARM_FILE" ]; then
local current_time=$(date +%H:%M)
# 检查闹钟是否到时间
python3 -c "
import json, time, platform, subprocess
with open('$ALARM_FILE', 'r') as f:
alarms = json.load(f)
current_time = '$current_time'
for alarm in alarms:
if alarm.get('enabled', True) and alarm['time'] == current_time:
print(f'⏰ 闹钟时间到!{alarm[\"message\"]}')
# 播放声音
system = platform.system().lower()
try:
if system == 'darwin':
subprocess.run(['afplay', '/System/Library/Sounds/Submarine.aiff'], timeout=3)
elif system == 'linux':
subprocess.run(['paplay', '/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga'], timeout=3)
elif system == 'windows':
import winsound
winsound.Beep(1000, 500)
except:
pass
# 禁用非重复闹钟
alarm['enabled'] = False
"
fi
sleep 30
done
}
# 主菜单
main() {
echo "=" * 50
echo "⏰ 闹钟管理脚本"
echo "=" * 50
while true; do
echo ""
echo "📌 命令菜单:"
echo "1. 添加闹钟"
echo "2. 查看闹钟"
echo "3. 删除闹钟"
echo "4. 启动监控"
echo "5. 退出"
read -p "请输入选择 (1-5): " choice
case $choice in
1)
read -p "请输入时间 (HH:MM): " time
read -p "请输入提醒信息: " message
add_alarm "$time" "$message"
;;
2)
list_alarms
;;
3)
list_alarms
read -p "请输入要删除的闹钟编号: " id
delete_alarm $id
;;
4)
monitor_alarms
;;
5)
echo "👋 再见!"
exit 0
;;
*)
echo "❌ 无效选择"
;;
esac
done
}
# 运行主函数
main
使用方法
Python版本:
# 保存为 alarm.py chmod +x alarm.py ./alarm.py
Shell版本:
# 保存为 alarm.sh chmod +x alarm.sh ./alarm.sh
功能特点
- 添加闹钟:支持指定时间、消息、是否重复
- 查看闹钟:显示所有闹钟状态
- 删除闹钟:按ID删除
- 启用/禁用:临时开关闹钟
- 声音提醒:自动播放声音
- 持久化存储:闹钟数据保存在JSON文件中
这个脚本可以根据你的需求进一步定制,比如添加更多闹钟类型、美化界面等。