Shell脚本获取CP2105设备最低编号ttyUSB接口取首行失败求解
问题根源
你将head -1放在了for循环内部的子shell中,每次循环仅处理单个设备的输出,单条输出下head -1不会过滤内容,最终符合筛选条件的设备有多少个就会输出多少行。你需要先收集所有符合条件的tty设备,统一排序后再取第一行。
修正后的脚本
#!/bin/bash # 收集所有CP2105对应的tty设备,排序后取编号最小的 min_tty=$(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)" [[ -z "$ID_SERIAL" || "$ID_SERIAL" != *CP2105* ]] && continue echo "$devname" done | sort -V | head -1) # 输出结果,后续可直接调用$min_tty变量传入hamlib脚本 echo "$min_tty"
主要改动说明
- 移除了循环内不必要的子shell包裹,将不符合条件时的
exit改为continue跳过当前循环项,避免提前终止整个遍历逻辑 - 将CP2105的筛选逻辑提前到判断条件中,减少不必要的管道操作
- 所有符合条件的tty名称统一输出到循环外部,用
sort -V做自然排序(避免ttyUSB10排在ttyUSB2之前的字符排序问题),最后统一取第一行 - 直接将结果存入变量,匹配你后续调用hamlib的使用需求
简化备选方案
如果不需要做额外的自定义筛选,也可以直接通过串口设备的by-id软链接快速获取:
min_tty=$(ls -v /dev/serial/by-id/*CP2105* | xargs readlink -f | awk -F '/' '{print $NF}' | sort -V | head -1)
内容的提问来源于stack exchange,提问作者floridomd
相关产品推荐
相关产品推荐

