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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:15:02