使用 jstest 的 shell 脚本,如何让游戏手柄与我的脚本交互?

使用 jstest 的 shell 脚本,如何让游戏手柄与我的脚本交互?

我在这方面取得了部分成功,但我陷入了困境。这是我的脚本:

我想提示用户,等待 USB 游戏手柄的输入,然后根据按下的按钮执行命令。

if lsusb | grep -q '0583:2060'
then
  echo "press the A button"
  #
  if jstest --event /dev/input/js0 | grep -q "number 0, value 1"
  then
    echo "you pressed the A button"
  else
    echo "you pressed the NOT A button"
  fi
fi

它会检查游戏手柄是否连接良好。当我按下 A 按钮时,它还会检查 jstest 并回显“您按下了 A 按钮”。

不过,在这种情况下,我无法让它执行“else”部分,因为 grep 仅从 jstest(A 按钮)过滤“按钮 0,值 1”,这意味着如果我没有按下 A 按钮,jstest 正在管道不需要 grep,它总是等待 A 按钮。

我在想也许有什么办法可以做到:

grep -q "number ., value 1" 

它将返回按下的任何按钮,然后根据 grep 显示的内容执行不同的命令。我认为我可以为此使用 case 语句,但我无法让 jstest 与 case 一起使用。

我觉得 jstest 并不适合这种东西,只是为了测试,但广泛的谷歌搜索表明我没有其他选项可以通过脚本与游戏手柄进行交互。

如何制作一个 shell 脚本来提示用户,等待按下按钮,然后根据按下的按钮执行不同的命令?

答案1

您需要grep输出匹配的文本,比赛结束后停止。您还需要更彻底地过滤事件,因为您只对类型 1(按钮)的事件感兴趣:

jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1"

这将一直jstest运行,直到您按下按钮,然后输出事件信息。您可以使用以下方法处理此问题read,以查找按下的按钮的编号:

jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | read _ _ _ _ _ _ number _ _
if [ "${number%%,*}" -eq 0 ]
then
    echo "You pressed the A button."
else
    echo "You pressed a button other than A."
fi

相关内容