如何判定USB设备类别并存储设备编号?多U盘适配脚本开发问询
嘿,你的思路完全没问题!咱们可以把这个方案落地,还能轻松支持多个U盘的场景,我给你一步步拆解清楚:
核心思路
lsusb -t的输出里,USB大容量存储设备的行会明确包含Class=Mass Storage(或者简化的Class=Mass),而且每行自带Dev x标识。我们要做的就是:筛选出这些行 → 提取出Dev后面的数字 → 把这些数字存起来方便后续处理。
具体实现脚本
先给你一个直接能用的bash脚本,我会逐行解释:
#!/bin/bash # 1. 提取所有USB大容量存储设备的Dev编号,存到数组里 # 这里用grep筛选目标行,sed正则提取数字 mass_devs=($(lsusb -t | grep "Class=Mass" | sed -E 's/.*Dev ([0-9]+).*/\1/')) # 2. 检查是否找到设备 if [ ${#mass_devs[@]} -eq 0 ]; then echo "⚠️ 没有检测到USB大容量存储设备" exit 1 fi # 3. 输出并处理找到的设备 echo "✅ 找到以下USB大容量存储设备的Dev编号:" for dev_num in "${mass_devs[@]}"; do echo "- Dev $dev_num" # 如果你需要查看该设备的详细信息,可以加这行 # lsusb | grep "Dev $dev_num" done
关键命令拆解
怕你对正则和bash数组不熟,我把核心命令拆开讲:
lsusb -t | grep "Class=Mass":过滤出所有大容量存储设备的行sed -E 's/.*Dev ([0-9]+).*/\1/':用正则提取Dev后面的数字-E:启用扩展正则,让语法更直观.*Dev ([0-9]+).*:匹配任意字符+Dev+一串数字+任意字符,括号里的[0-9]+就是我们要抓的数字\1:把整行替换成刚才括号里捕获的数字
备选方案:用awk更灵活
如果你觉得sed的正则有点绕,也可以用awk来实现,逻辑更清晰:
mass_devs=($(lsusb -t | awk '/Class=Mass/ { for(i=1; i<=NF; i++) { if ($i ~ /Dev/) { sub(/,/, "", $i) # 去掉数字后面的逗号 print substr($i, 4) # 从第4个字符开始取,就是Dev后面的数字 } } }'))
注意事项
- 不同系统的
lsusb -t输出可能略有差异,如果你的系统里Class名称是Mass Storage,grep "Class=Mass"依然能匹配到,不用改 - 普通用户就能执行
lsusb,不需要sudo权限 - 如果要进一步操作这些设备(比如挂载),可能需要用到
/dev/sd*这类设备文件,这时候可以结合lsblk或者udevadm来关联Dev编号和实际设备路径,有需要的话可以再深挖~
内容的提问来源于stack exchange,提问作者Coffeeman
相关产品推荐
相关产品推荐

