我在这方面取得了部分成功,但我被卡住了。这是我的脚本:
我想提示用户,等待来自 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
Run Code Online (Sandbox Code Playgroud)
它检查游戏手柄是否连接正常。当我按下 A 按钮时,它还会检查 jstest 并回显“您按下了 A 按钮”。
但是,在这种情况下,我无法让它执行“其他”部分,因为 grep 仅从 jstest(A 按钮)过滤“按钮 0,值 1”,这意味着如果我不按下 A 按钮,jstest 正在管道没什么可 grep 的,它总是等待 A 按钮。
我在想也许有一些方法可以做到:
grep -q "number ., value 1"
Run Code Online (Sandbox Code Playgroud)
这将返回任何被按下的按钮,然后根据 grep 显示的内容执行不同的命令。我以为我可以为此使用 case 语句,但是我无法让 jstest 使用 case。
我觉得 jstest 不适合这种东西,只是为了测试,但广泛的谷歌搜索显示我没有其他选项可以通过脚本与游戏手柄进行交互。
如何制作一个 shell 脚本来提示用户,等待按钮按下,然后根据按下的按钮执行不同的命令?
您需要grep输出匹配的文本,并在匹配后停止。您还需要更彻底地过滤事件,因为您\xe2\x80\x99只对类型1(按钮)的事件感兴趣:
jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1"\nRun Code Online (Sandbox Code Playgroud)\n\n这将一直jstest运行,直到您按下按钮,然后输出事件信息。您可以使用以下方法处理此问题,read以查找按下的按钮的编号:
jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | read _ _ _ _ _ _ number _ _\nif [ "${number%%,*}" -eq 0 ]\nthen\n echo "You pressed the A button."\nelse\n echo "You pressed a button other than A."\nfi\nRun Code Online (Sandbox Code Playgroud)\n