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: ID
  • $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... )

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}' GNUgrep -Po '^.*?ID \K.{9}'が有効になっているか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デフォルト値が引き続き含まれることを保証できます。最初の2つのコマンドを省略し、次のように単純化できます。

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

あるいは、norコマンドを/sys使用せずに直接情報を取得することもできます。lsusbawkzsh

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

idVendorglobbingを使用してファイルを検索し、eglob修飾子を使用して各glob拡張をそのファイルの内容と同じディレクトリにあるファイルの内容に置き換えますidProduct(ソートされたリストを提供する利点もあります)。

関連情報