挂载前检测文件系统是否为ext4的Bash脚本运行异常求助
脚本存在的核心问题
- 使用
fdisk -l获取文件系统类型的逻辑完全错误:fdisk输出的最后一列是分区类型标记(如Linux对应分区ID 83),并不是分区实际格式化后的真实文件系统类型,就算分区标记是Linux,实际格式化为XFS/Btrfs也无法被正确识别 - 字符串提取逻辑有问题:通过
${fs#*$DEV}提取出的fs1带有前置空格,直接和不带空格的ext4字符串比较永远匹配失败 - 条件判断中用到的
$diskL变量未定义,导致-e $diskL判断永远不成立,无论文件系统是什么都会走到else分支输出Good fs fdisk -l默认需要root权限运行,普通用户执行时拿不到完整输出,检测逻辑直接失效
修复后的可用脚本
检测文件系统应该使用专门查询块设备属性的blkid命令,不需要解析复杂输出,稳定性更高,普通用户也可正常运行:
DEV=/dev/sda1 # 直接提取指定设备的文件系统类型 fs_type=$(blkid -o value -s TYPE "$DEV") if [[ "$fs_type" == "ext4" ]]; then echo "Good fs" else echo "Bad fs" fi
如果需要兼容无blkid的环境,也可以用lsblk实现相同功能:
DEV=/dev/sda1 fs_type=$(lsblk -no FSTYPE "$DEV")
注意事项
- 字符串比较时建议给变量套双引号,避免变量为空或者带空格时出现语法错误
- 不要解析
fdisk/df这类命令的文本输出来获取块设备属性,输出格式随环境变化大,非常容易出错
内容的提问来源于stack exchange,提问作者Vvojtek
相关产品推荐
相关产品推荐

