그래서 구성에서 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}')
$
처음부터 제거하고 $
앞에 추가해야 합니다 (
. 일부 인용문도 도움이 될 것입니다. 즉
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: TV 시리즈
이름과 같은 여러 필드를 인쇄하려면 다음을 수행하십시오.
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... )
get 명령의 출력은 입니다 $(a command)
.
개행 문자를 특수 변수에 할당하고 와일드카드를 비활성화한 후 f
다른 쉘이나 다른 쉘에서 따옴표 없이(split+glob 연산자) 매개변수 확장 플래그를 사용하여 개행 문자에 대한 명령 출력을 분할할 수 있습니다.zsh
$(...)
$IFS
zsh
:array=( ${(f)"$(a command)"} )
기타 쉘(zsh라고도 함)
IFS=' ' set -o noglob # not needed in zsh unless in sh/ksh emulation array=( $(a command) )
다른 사람들이 말했듯이 명령 출력의 각 줄에서 공백으로 구분된 6번째 필드를 얻으려면 또는awk '{print $6}'
( grep -Po '^.*?ID \K.{9}'
GNU가 활성화되었거나 grep
Perl 스타일 정규식 지원과 호환된다고 가정)을 사용하여 첫 번째 Happens 이후 9자를 얻을 수 있습니다. 용어 ID<space>
. 전체적으로는 다음과 같습니다.
array=( ${(f)"$(lsusb | awk '{print $6}')" ) # (zsh)
IFS='
'
set -o noglob
array=( $(lsusb | awk '{print $6}') )
이제 기본값은 $IFS
공백, 탭, 줄 바꿈(zsh에서는 NUL)이고 USB ID는 이론적으로 16진수와 콜론만 포함하므로 awk
출력에 공백, 탭, nul 또는 glob 문자가 포함되지 않도록 보장해야 합니다. $IFS
기본값이 계속 포함되도록 보장할 수 있습니다 . 처음 두 명령을 생략하고 다음과 같이 단순화할 수 있습니다.
array=( $(lsusb | awk '{print $6}') )
또는 nor 명령을 /sys
사용하지 않고 직접 정보를 얻을 수도 있습니다 .lsusb
awk
zsh
array=(
/sys/bus/usb/devices/*/idVendor(Ne['REPLY=$(<$REPLY):$(<$REPLY:h/idProduct)'])
)
idVendor
globbing을 사용하여 파일을 찾고 , e
glob 한정자를 사용하여 각 glob 확장을 해당 파일의 내용과 동일한 디렉터리에 있는 파일의 내용으로 바꿉니다 idProduct
(정렬된 목록을 제공하는 이점도 있음).