Linux 셸은 사용자 입력에서 장치 ID를 가져옵니다.

Linux 셸은 사용자 입력에서 장치 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}')

$처음부터 제거하고 $앞에 추가해야 합니다 (. 일부 인용문도 도움이 될 것입니다. 즉

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가 활성화되었거나 grepPerl 스타일 정규식 지원과 호환된다고 가정)을 사용하여 첫 번째 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사용하지 않고 직접 정보를 얻을 수도 있습니다 .lsusbawkzsh

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

idVendorglobbing을 사용하여 파일을 찾고 , eglob 한정자를 사용하여 각 glob 확장을 해당 파일의 내용과 동일한 디렉터리에 있는 파일의 내용으로 바꿉니다 idProduct(정렬된 목록을 제공하는 이점도 있음).

관련 정보