You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键部分解释:

  1. lsusb输出处理:

    • 用while read循环逐行读取lsusb的结果,IFS=是为了保留行首的空格,避免设备描述被截断。
    • awk '{print $6}'提取lsusb输出中第6列的设备ID(比如8087:0024)。
    • cut -d' ' -f7-提取从第7列到行尾的设备描述,这样用户能看到清晰的设备名称。
  2. whiptail菜单:

    • whiptail --menu创建选择菜单,参数分别是标题、提示语、窗口高度、宽度、显示的选项数量,最后传入我们整理好的设备数组。
    • 3>&1 1>&2 2>&3是一个小技巧:whiptail默认把用户选择的结果输出到stderr,通过重定向把它转到stdout,这样我们才能用变量捕获选中的内容。
  3. 配置文件写入:

    • 先用grep -q检查配置项是否已存在,存在就用sed替换原有值,不存在就直接追加新行,这样不管配置文件有没有初始内容都能正常工作。

你可以把这个脚本保存为usb-config.sh,然后用chmod +x usb-config.sh赋予执行权限,运行即可。

内容的提问来源于stack exchange,提问作者Martinn Roelofse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:18