Shell脚本实现:通过用户选择获取lsusb的设备ID与厂商ID
嘿,我来帮你搞定这个USB设备配置脚本!你的思路完全正确,咱们一步步把它落地成可运行的代码,还会给你解释每个部分的作用,方便你理解~
首先,先确保你的系统安装了whiptail(大部分Linux发行版默认都有,如果没有的话可以用包管理器安装,比如Debian/Ubuntu用sudo apt install whiptail)。
下面是完整的脚本,我会逐段解释:
#!/bin/bash # 检查whiptail是否安装 if ! command -v whiptail &> /dev/null; then echo "错误:whiptail未安装,请先安装whiptail后再运行脚本!" exit 1 fi # 捕获lsusb的输出,整理成whiptail菜单可用的选项数组 usb_devices=() while IFS= read -r line; do # 从lsusb行中提取设备ID(格式:厂商ID:设备ID) device_id=$(echo "$line" | awk '{print $6}') # 提取设备的完整描述(从第7列到行尾) device_desc=$(echo "$line" | cut -d' ' -f7-) # 把描述和ID成对加入数组(whiptail菜单需要"标签 描述"的格式) usb_devices+=("$device_desc" "$device_id") done < <(lsusb) # 检查是否检测到USB设备 if [ ${#usb_devices[@]} -eq 0 ]; then whiptail --errorbox "未检测到任何USB设备!" 10 50 exit 1 fi # 显示whiptail选择菜单,让用户挑选设备 selected_device=$(whiptail --title "选择USB设备" --menu "请选择要写入配置的USB设备:" 20 70 10 "${usb_devices[@]}" 3>&1 1>&2 2>&3) # 判断用户是否取消了选择 if [ $? -ne 0 ]; then echo "用户取消了操作" exit 0 fi # 根据选中的设备描述,找到对应的设备ID device_id="" for ((i=0; i<${#usb_devices[@]}; i+=2)); do if [ "${usb_devices[$i]}" = "$selected_device" ]; then device_id="${usb_devices[$i+1]}" break fi done # 拆分厂商ID和设备ID vendor_id=$(echo "$device_id" | cut -d':' -f1) product_id=$(echo "$device_id" | cut -d':' -f2) # 定义配置文件路径(你可以改成自己需要的路径) config_file="./usb_config.ini" # 如果配置文件不存在,创建它 if [ ! -f "$config_file" ]; then touch "$config_file" fi # 写入或更新配置项:厂商ID if grep -q "^USB_VENDOR_ID=" "$config_file"; then # 如果已存在,替换原有值 sed -i "s/^USB_VENDOR_ID=.*/USB_VENDOR_ID=$vendor_id/" "$config_file" else # 如果不存在,追加新行 echo "USB_VENDOR_ID=$vendor_id" >> "$config_file" fi # 写入或更新配置项:设备ID if grep -q "^USB_PRODUCT_ID=" "$config_file"; then sed -i "s/^USB_PRODUCT_ID=.*/USB_PRODUCT_ID=$product_id/" "$config_file" else echo "USB_PRODUCT_ID=$product_id" >> "$config_file" fi # 提示用户配置完成 whiptail --msgbox "配置已成功写入!\n厂商ID: $vendor_id\n设备ID: $product_id" 12 50
关键部分解释:
lsusb输出处理:
- 用
while read循环逐行读取lsusb的结果,IFS=是为了保留行首的空格,避免设备描述被截断。 awk '{print $6}'提取lsusb输出中第6列的设备ID(比如8087:0024)。cut -d' ' -f7-提取从第7列到行尾的设备描述,这样用户能看到清晰的设备名称。
- 用
whiptail菜单:
whiptail --menu创建选择菜单,参数分别是标题、提示语、窗口高度、宽度、显示的选项数量,最后传入我们整理好的设备数组。3>&1 1>&2 2>&3是一个小技巧:whiptail默认把用户选择的结果输出到stderr,通过重定向把它转到stdout,这样我们才能用变量捕获选中的内容。
配置文件写入:
- 先用
grep -q检查配置项是否已存在,存在就用sed替换原有值,不存在就直接追加新行,这样不管配置文件有没有初始内容都能正常工作。
- 先用
你可以把这个脚本保存为usb-config.sh,然后用chmod +x usb-config.sh赋予执行权限,运行即可。
内容的提问来源于stack exchange,提问作者Martinn Roelofse
相关产品推荐
相关产品推荐

