从行获取变量

从行获取变量

你好,我有这条线

$ 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=-ddelimiter) switch),并获取第二个字段,这是12您想要的。

这一切都在子 shell 中运行,其输出用作变量的值。

相关内容