![选择设备的特定 ttyUSBx](https://linux22.com/image/13099/%E9%80%89%E6%8B%A9%E8%AE%BE%E5%A4%87%E7%9A%84%E7%89%B9%E5%AE%9A%20ttyUSBx.png)
我正在尝试改进一个脚本来在 Debian Linux 中连接我的蜂窝调制解调器。该调制解调器枚举了 5 个 USB 端口,我需要将特定端口用于特定目的(一个用于启动数据连接,一个用于查询信号强度等统计信息)。原始脚本文件手动选择 /dev/ttyUSB3 进行连接,但是当连接其他 USB 设备时,它们偶尔会优先为 ttyUSB0 和 ttyUSB1,这会将单元调制解调器 tty 端口向上移动,以便我可能需要使用 ttyUSB4 或 ttyUSB5,具体取决于是否存在其他设备。将端口保持静态会导致脚本在某些情况下失败。
使用lsusb,
Bus 001 Device 006: ID 2c7c:0121
我可以看到调制解调器是总线 001 设备 006 ID:2c7c:0121
并且使用 udevadm 信息我可以手动过滤每个 ttyUSB 的属性以查看哪个设备位于哪个端口上。
echo `udevadm info --name=/dev/ttyUSB3 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d",$1,$2);print $1;}'` | tr " " "/"
给我
busnum:001/devnum:006
手动将 ttyUSB4 更改为其他端口会显示每个端口上有哪些其他设备。我找到并调整了另一个脚本,但不断出现奇怪的问题,导致其无法按预期运行。这是我当前的脚本
#!/bin/bash
myport=0
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && continue
eval "$udevadm -]info -q property --export -p $syspath)"
if [ "$ID_VENDOR_ID" == '2c7c' ]; then
echo "/dev/$devname - $ID_VENDORID:$ID_MODEL_ID"
myport= `expr $myport + 1 `
if [ $myport == 3 ]
then
echo $port
port= "/dev/$devname"
fi
fi
)
if [ -z $port ]
then
echo $port
fi
done
当我运行脚本时,它会正确过滤掉与 VID 2c7c 匹配的设备,但由于某种原因,我无法在 for 循环中增加 myport 它从 0 到 1,但似乎每次迭代都会重置为 0 并增加回 1输出看起来像
/dev/ttyUSB0 - 2c7c:0121
1
/dev/ttyUSB1 - 2c7c:0121
1
/dev/ttyUSB2 - 2c7c:0121
1
/dev/ttyUSB3 - 2c7c:0121
1
/dev/ttyUSB4 - 2c7c:0121
1
如果我在 for 循环之上执行此操作,它将按预期工作
x=0
x=`expr $x + 1 `
x=`expr $x + 1 `
x=`expr $x + 1`
echo $x
将输出“3”
我需要做什么才能正确数到 3 并吐出此时关联的 /dev/ttyUSB 设备?