如何将变量中的功能键(F3、F4……)值捕获到脚本 shell 中?

如何将变量中的功能键(F3、F4……)值捕获到脚本 shell 中?

我正在寻找一种方法来在用户按下功能键时捕获变量中功能键的值。我尝试使用dd命令,但只有字母或数字键被捕获:dd 命令不起作用,为什么功能键不起作用。

下面是我尝试过的几行测试,但是变量总是使用功能键返回任何内容:

selection=`dd if=/dev/tty bs=2 count=2 2>/dev/null`
selection=$(dd bs=2 count=2 2>/dev/null)
selection=`dd bs=1 count=1 2>/dev/null`
selection=$(dd bs=1 count=1 2>/dev/null)
selection=`head -c1`
selection=$(head -c1)

例如

  • 当我按下 F3 键时,值^[[13~出现在屏幕上,但是执行时echo selection=$selection,我的变量“selection”保持为空(selection=)

  • 当我按下 d 键时,值 d 出现在屏幕上,并且当执行 echo choice=$selection 时,我的变量“selection”等于 (selection=d)

为什么它不能与功能键(F3......)一起使用?

答案1

你可以这样做:

  • 读取按键代码
    按下Ctrl+v然后按下一个键。F1例如
    并读取输出。F1给出^[OP
    注意为此^[Escape将在脚本中写入如下内容\e

  • 或者获取功能键的所有代码
    for x in {1..24}; do echo -n "F$x "; tput kf$x | cat -A; echo; done
    假设F13Shift+F1


  • 使用 bash 函数处理脚本中的按键,例如whilereadcase / esac

例子:

#!/bin/bash

ReadKey() {
  if read -sN1 KEY; then
    while read -sN1 -t 0.001 ; do
      KEY+="${REPLY}"
    done
  fi
}

while ReadKey; do
  case "${KEY}" in
    $'\eOP')   echo 'F1';;
    $'\e[24~') echo 'F12';;
    *) echo    "Keys pressed: ${KEY}";;
  esac
done

相关内容