因此,我正在为一个程序编写安装脚本,该程序在其配置中需要来自 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
无需使用lsusb
norawk
命令zsh
:
array=(
/sys/bus/usb/devices/*/idVendor(Ne['REPLY=$(<$REPLY):$(<$REPLY:h/idProduct)'])
)
使用 globbing 来查找idVendor
文件,并使用e
glob 限定符将每个 glob 扩展替换为该文件的内容以及同一目录中的文件的内容idProduct
(还有一个好处是可以为您提供排序列表)。