Я подключаю устройства USB-Serial к своему устройству, используя разные порты, и устройства с последовательным интерфейсом USB иногда отображаются как «ttyUSB0», иногда «ttyUSB1» или «ttyUSB2».

Как я могу написать скрипт для извлечения всех имен ttyUSB из этой команды:

deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')"
   echo "${deviceNodes}"

   for i in "${deviceNodes[@]}"
   do
    udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
   done

и сохранить его в переменной и зациклить элементы в списке?

Вот результат команды dmesg:

[37606.832517] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[37664.565271] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[37695.844687] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[38017.111961] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[38490.802048] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[38776.225985] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[38778.317840] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[38874.027395] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[38876.631579] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[39040.443963] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[39796.942837] usb 2-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
[39802.674018] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB1
[40372.029798] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
[40372.156024] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[41642.886671] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0

2 ответа2

0
> deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')"

Это синтаксическая ошибка. Вы не можете использовать пробел вокруг знака равенства в присваивании переменной. Смотрите также http://mywiki.wooledge.org/BashPitfalls#foo_.3D_bar

Кроме того, если вы хотите перебирать только реальные совпадения, вам нужно изменить выражение, чтобы только извлечь их. Попробуй это.

dmesg | grep -Eo 'ttyUSB[0-9]+' | sort -u |
while read devnode; do
    udevadm info -a -n /dev/"$devnode" | grep '{serial}' | head -n1
done

(В моей системе dmesg прекрасно работает без sudo и не имеет аргумента tail .)

0

Разве это не просто вопрос изменения следующего,

deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')"

к этому?

deviceNodes="$(cat temp | egrep -i 'ttyUSB' | sed 's/^.*tty/tty/' )"

'i', очевидно, будет той переменной, которую нужно перебрать.

Тест был следующий.

echo "[37664.565271] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0" | sed 's/^.*tty/tty/'
ttyUSB0

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .