行から変数を取得する

行から変数を取得する

こんにちは、この行があります。

$ echo $(xinput | grep "TouchPad") SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)]

どういうわけか12を取得して変数に保存できるかどうかを尋ねたい。ありがとうございます。

答え1

device_id=$(xinput | sed -n 's/.*TouchPad.*id=\([0-9]*\).*/\1/p')

バラよりもう一つの答えこれは一般的なイディオムの説明ですsed

答え2

デバイスの数値識別子を取得する必要はなく、文字列を直接使用できます。xinput list --name-only | grep Touchpad「タッチパッド」を含むデバイス名を1行に1つずつ一覧表示するために使用されます。

数字識別子が必要な場合は、xinput list今度はに再度電話してください--id-only

name=$(xinput list --name-only | grep Touchpad)
nl='
'
case "$name" in
  *"$nl"*) echo "Multiple touchpad devices found, aborting"; exit 2;;
  "") echo "No touchpad device found, aborting"; exit 2;;
esac
id=$(xinput list --id-only "$name")

答え3

コンピュータでこのスクリプト/変数を使用する場合は、デバイス名は常に同じです。だからあなたはできます

$ xinput list --id-only "SynPS/2 Synaptics TouchPad"
#Output:
12

変数に保存するには:

$ var=$(xinput list --id-only "SynPS/2 Synaptics TouchPad")

答え4

最も効率的な方法ではありませんが、簡単な方法は次のとおりです。

deviceid="$(xinput | grep "TouchPad" | grep -oE 'id=[^ ]+' | cut -d= -f2)"

"$deviceid"その後、スクリプトでこれを参照できます。

どのように機能するかを確認するには、最初に開始したコマンドを使用して解析する入力行を取得します。その後、grep -o行全体ではなく一致するデータのみを返すを使用するため、-E構文はよりきれいになります。表現は、/id=[^ ]+/「a i、a d=記号、および1つ以上の文字を意味します。いいえスペース。このid=12ように抽出して送信すると、cut入力をシンボルに分割するように指示します((for)。=-dD12区切り文字)スイッチ)を選択し、目的の2番目のフィールドを取得します。

これはすべてサブシェルで実行され、その出力は変数値として使用されます。

関連情報