Linux shell 从用户输入中获取设备 ID

Linux shell 从用户输入中获取设备 ID

因此,我正在为一个程序编写安装脚本,该程序在其配置中需要来自 lsusb 的设备 ID,因此我正在考虑执行以下操作:

$usblist=(lsusb)
#put the list into a array for each line.
#use the array to give the user a selection list usinging whiptail.
#from that line strip out the device id and vender id from the selected line.

该行如下所示:

Bus 001 Device 004: ID 0665:5161 Cypress Semiconductor USB to Serial

所以我只想要“ID{space}”之后的 9 个字符

答案1

我看到的第一个错误是。你写了$usblist=(lsusb | awk '{print $6}')

您需要$从开头删除 ,并$在 之前添加(。一些引言也会有所帮助。 IE

usblist="$(lsusb | awk '{print $6}')"

答案2

只需使用,这用于awk打印出该6th字段,在您的情况下是设备的 ID

usblist="$(lsusb | awk '{print $6}')"

因此,您可以打印所需的任何字段,以下是映射:

  • $1 : 巴士
  • 2 美元:001
  • $3:设备
  • 4 美元:004:
  • 5 美元:身份证
  • 6 美元:0665:5161
  • $7 : 柏树
  • 8 美元:半导体
  • 9 美元:USB
  • 10 美元:至
  • $11:连续剧

如果你想打印多个字段,比如姓名,你可以这样做

usblist="$(lsusb | awk '{print $7,$8,$9}')"

答案3

usb列表=lsusb | awk '{print $6}'

回显$usblist

它应该打印 0665:5161,除了 awk 之外,您还可以使用 cut 命令。查看 cut 的手册页以获取更多信息。

答案4

zsh、ksh93、bash、mksh 或 yash 中的数组赋值语法为:

array=( value1 value2... )

获取命令的输出是$(a command)

在将换行符分配给特殊变量并禁用通配符之后,可以通过在其他 shell 中或其他 shell 中使用f参数扩展标志来完成在换行符上分割命令的输出,方法是不加引号(split+glob 运算符)。zsh$(...)$IFS

  • zsh:

    array=( ${(f)"$(a command)"} )
    
  • 其他 shell(还有 zsh)

    IFS='
    '
    set -o noglob # not needed in zsh unless in sh/ksh emulation
    array=( $(a command) )
    

要获取命令输出的每行的第 6 个空白分隔字段,正如其他人所说,您可以使用orawk '{print $6}'grep -Po '^.*?ID \K.{9}'假设启用了 GNUgrep或与 perl 样式正则表达式支持兼容)来获取第一个之后的九个字符按照您的要求发生ID<space>。总而言之,就变成了:

array=( ${(f)"$(lsusb | awk '{print $6}')" ) # (zsh)
IFS='
'
set -o noglob
array=( $(lsusb | awk '{print $6}') )

现在, 的默认值$IFS是空格、制表符、换行符(以及 zsh 中的 NUL),而 USB id 理论上只包含十六进制数字和冒号,因此awk应保证 的输出不包含空格、制表符、nul 或 glob 字符,所以如果你能保证$IFS仍然包含它的默认值,你可以省略前两个命令并将其简化为:

array=( $(lsusb | awk '{print $6}') )

或者您可以直接从中获取信息,而/sys无需使用lsusbnorawk命令zsh

array=(
  /sys/bus/usb/devices/*/idVendor(Ne['REPLY=$(<$REPLY):$(<$REPLY:h/idProduct)'])
)

使用 globbing 来查找idVendor文件,并使用eglob 限定符将每个 glob 扩展替换为该文件的内容以及同一目录中的文件的内容idProduct(还有一个好处是可以为您提供排序列表)。

相关内容