请求编写Bash脚本遍历文件夹并使用dd刷写指定img.xz镜像
实现eMMC镜像刷写的Bash脚本方案
直接上可运行的脚本,满足指定文件刷写或交互式选择刷写的需求:
#!/bin/bash # 切换到/img/目录,失败则退出 cd /img/ || { echo "无法进入/img/目录,脚本退出"; exit 1; } # 收集所有.img.xz镜像文件 IMAGE_FILES=(*.img.xz) # 检查是否存在镜像文件 if [ ${#IMAGE_FILES[@]} -eq 0 ]; then echo "/img/目录下未找到任何.img.xz镜像文件" exit 1 fi # 处理命令行参数:如果指定了镜像文件名,直接验证并刷写 if [ $# -eq 1 ]; then TARGET_IMAGE="$1" # 检查指定文件是否存在且是.img.xz格式 if [[ -f "$TARGET_IMAGE" && "$TARGET_IMAGE" == *.img.xz ]]; then echo "开始刷写镜像: $TARGET_IMAGE 到 /dev/mmcblk0" echo "警告:此操作会清除/dev/mmcblk0上的所有数据!按Enter继续,按Ctrl+C取消" read -r unxz -c "$TARGET_IMAGE" | dd of=/dev/mmcblk0 bs=4096 status=progress if [ $? -eq 0 ]; then echo "镜像刷写完成" else echo "刷写过程中出现错误" fi exit 0 else echo "指定的文件不存在或不是.img.xz格式" exit 1 fi fi # 无参数时,列出所有镜像供用户选择 echo "找到以下镜像文件,请选择要刷写的序号:" select IMAGE in "${IMAGE_FILES[@]}" "退出"; do if [ "$IMAGE" == "退出" ]; then echo "脚本已退出" exit 0 elif [[ -n "$IMAGE" ]]; then echo "开始刷写镜像: $IMAGE 到 /dev/mmcblk0" echo "警告:此操作会清除/dev/mmcblk0上的所有数据!按Enter继续,按Ctrl+C取消" read -r unxz -c "$IMAGE" | dd of=/dev/mmcblk0 bs=4096 status=progress if [ $? -eq 0 ]; then echo "镜像刷写完成" else echo "刷写过程中出现错误" fi break else echo "无效选择,请重新输入" fi done
脚本关键功能说明
- 目录切换:启动时自动切换到
/img/,切换失败直接退出,避免后续操作出错 - 两种运行模式:
- 指定文件名模式:直接在脚本后跟上镜像文件名(如
./flash.sh my-image.img.xz),脚本验证文件有效性后执行刷写 - 交互式选择模式:不带参数运行脚本,自动列出所有
.img.xz文件,用户选择序号后执行刷写
- 指定文件名模式:直接在脚本后跟上镜像文件名(如
- 安全提示:刷写前弹出警告,要求用户确认,防止误操作
- 状态反馈:使用
dd的status=progress参数实时显示刷写进度,方便监控
注意事项
- 权限要求:必须以root用户运行脚本(live环境通常默认root,若不是需加
sudo) - 设备节点确认:确保
/dev/mmcblk0是目标eMMC设备,可通过lsblk命令核对设备大小和分区信息,避免刷错存储设备 - 数据备份:刷写会清除目标设备所有数据,操作前务必确认无重要数据
- live环境兼容性:脚本依赖
unxz和dd工具,主流Linux live镜像(如Ubuntu Live、Debian Live)均默认包含这些工具,无需额外安装
内容的提问来源于stack exchange,提问作者Sojab0on
相关产品推荐
相关产品推荐

