你好,我有这条线
$ 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
列出包含“触摸板”的设备名称,每行一个。
如果您确实需要数字标识符,请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
如果您打算在您的计算机中使用此 script/var,则设备名称将始终相同。因此你可以这样做
$ 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=[^ ]+/
意思是“一个i
、一个d
、一个=
符号以及一个或多个字符不是空间。这样提取id=12
.然后我将其发送到,我告诉它在符号cut
处分割输入(用(for=
-d
delimiter) switch),并获取第二个字段,这是12
您想要的。
这一切都在子 shell 中运行,其输出用作变量的值。