Debian Linuxで携帯電話モデムを接続するスクリプトを改善しようとしています。モデムは5つのUSBポートを列挙し、特定の目的に特定のポートを使用する必要があります(1つはデータ接続を開始し、もう1つは信号強度などの統計を照会するため)。ソーススクリプトファイルでは、接続する/dev/ttyUSB3を手動で選択しますが、他のUSBデバイスが接続されている場合は、ttyUSB0とttyUSB1の優先順位を指定してデバイスモデムのttyポートを上に移動するため、状況によってはttyUSB4またはttyUSB5を使用する必要があります。他のデバイスがある場合。ポートを静的に保持すると、スクリプトが失敗することがあります。
lsusbを使用して、
Bus 001 Device 006: ID 2c7c:0121
モデムはバス001デバイス006 ID:2c7c:0121
で、udevadm infoを使用して各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にリセットされ、繰り返しごとに増加するようです。出力は次のようになります。良い
/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デバイスをエクスポートするにはどうすればよいですか?