快速测试所有键盘按键的脚本

快速测试所有键盘按键的脚本

我需要检查一些笔记本电脑的键盘按键是否损坏,因此我想尽可能加快速度。

我没有找到任何关于这个特定任务的信息,所以我的想法是一个读取按下的按键并知道所有键盘按键的脚本,这样我就可以快速地敲打它们,并报告哪些按键尚未按下。我想我可以用showkeyor 来完成这个xev任务,grep 输出:

xev | grep keysym

示例输出:

state 0x10, keycode 46 (keysym 0x6c, l), same_screen YES,
state 0x10, keycode 33 (keysym 0x70, p), same_screen YES,
state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,

可读的键符号非常有用,但我需要测试键码,因为它们不会随着修饰键的打开/关闭(大写锁定、数字锁定)而改变。我是 bash 新手,所以我正在整理一些东西。这是迄今为止最好的结果:

#!/bin/bash

function findInArray() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}* ]]; then
    echo "${!i}"
    return 0
    fi
    }
    echo
    return 1
}

list=( 38:a 56:b 54:c 40:d 26:e 36:Return 50:Shift_L )
xev | \
# old grep solution
# grep -Po '(?<=keycode )[0-9]+(?= \(keysym 0x)' | \
# 200_success' suggestion
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    echo Pressed $found
    list=(${list[@]/${keycode}\:*/})
    echo 'Remaining ===>' ${list[@]}
    if [[ ${#list[@]} == 0 ]]; then
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

当我使用grep它时,它仅在关闭时打印输出xev,并且最终也不会杀死它。 @200_success 的建议awk解决了这些问题,但它不会立即打印输出:需要按 5-6 次按键才能“刷新”输出。我该如何解决这个问题?

注意:我知道这个脚本需要为每个不同型号的键盘提供不同的按键列表,但这没关系,因为我只有几个型号要测试。


编辑1:我用最新的脚本代码编辑了问题。

编辑2:根据@200_success建议更新脚本。

答案1

尝试用以下脚本替换您的grepawk脸红它的输出。

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done

答案2

为什么你要经历这么漫长的过程?尝试键盘测试器io,我写这篇文章就是为了解决这个问题。

它比市场上的其他测试仪要好得多。

答案3

经过更多的尝试和错误,谷歌和man,这个版本按我的预期工作:

#!/bin/bash

function findInArray() {
  local n=$#
  local value=${!n}
  for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}:* ]]; then
      echo "${!i}"
      return 0
    fi
  }
  echo
  return 1
}

list=( 10:1 11:2 12:3 36:Return 37:Control_L 38:a 39:s 134:Super_R 135:Menu )
clear
echo -e "${#list[@]} keys to test\n\n${list[@]}"
xev | \
awk -W interactive '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    clear
    echo Pressed $found
    list=(${list[@]/$found/})
    remaining=${#list[@]}
    stdbuf -oL -eL echo -e "$remaining keys remaining\n\n${list[@]}"
    if [[ $remaining == 0 ]]; then
      clear
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

根据xev输出创建列表(我xev | grep keycode在文本编辑器上匆忙使用键盘粉碎和正则表达式替换)并替换它。

相关内容