bash:解析脚本中的F键(F1-F10)

我编写了一个 bash 脚本,它具有类似于“mc”或 Norton Commander 的“按钮”。现在,我使用数字键 (1-0) 来模拟按下的按钮。但是,我宁愿使用 F 键 (F1-F10) 来做这件事。

我看到了这个问题和答案,但我不确定这是否可以在脚本中使用以触发功能(例如,通过使用“读取”)。

bash 支持吗?如果是这样,是否有一种相当简单的方法来实现它?

更新

该脚本有点像破折号,需要刷新以保持内容最新。但是,同时我想保持“频道”开放以允许用户输入(因此sleep是不够的)。

当前用于获取用户输入的读取行如下所示:

read -n 1 -s -t "${iRefresh}" sReturnVar.

此处将“iRefresh”设置为 2 秒,以便在没有输入刷新显示时超时,然后返回到读取行。本质上,读取行在等待用户输入时兼作内容刷新。

回答

这将动态确定的值F1- F24,那么你正在寻找的上下文中使用它们。我的系统 coopts F11,所以我没有显示。这有点脆弱,因为它依赖于terminfo健全的终端代码——YMMV。

#!/usr/bin/env bash

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

declare -a fnkey
for x in {1..24}; do
    raw=$(tput kf$x | cat -A)
    fnkey[$x]=${raw#^[}
done

while read_key_press; do
  case "${key_press}" in
    $'e'${fnkey[1]})   echo 'F1';;
    $'e'${fnkey[2]})   echo 'F2';;
    $'e'${fnkey[3]})   echo 'F3';;
    $'e'${fnkey[4]})   echo 'F4';;
    $'e'${fnkey[5]})   echo 'F5';;
    $'e'${fnkey[6]})   echo 'F6';;
    $'e'${fnkey[7]})   echo 'F7';;
    $'e'${fnkey[8]})   echo 'F8';;
    $'e'${fnkey[9]})   echo 'F9';;
    $'e'${fnkey[10]})   echo 'F10';;
    $'e'${fnkey[11]})   echo 'F11';;
    $'e'${fnkey[12]})   echo 'F12';;
    $'e'${fnkey[13]})   echo 'F13';;
    $'e'${fnkey[14]})   echo 'F14';;
    $'e'${fnkey[15]})   echo 'F15';;
    $'e'${fnkey[16]})   echo 'F16';;
    $'e'${fnkey[17]})   echo 'F17';;
    $'e'${fnkey[18]})   echo 'F18';;
    $'e'${fnkey[19]})   echo 'F19';;
    $'e'${fnkey[20]})   echo 'F20';;
    $'e'${fnkey[21]})   echo 'F21';;
    $'e'${fnkey[22]})   echo 'F22';;
    $'e'${fnkey[23]})   echo 'F23';;
    $'e'${fnkey[24]})   echo 'F24';;
    ^D) exit ;;    # note: this is a real <ctrl>-<d>
    *) echo    "Key pressed: ${key_press}";;
  esac
done

对我来说,这会产生:

<~> $ /tmp/so8897.sh
Key pressed: q
Key pressed: w
Key pressed: e
Key pressed: r
Key pressed: t
Key pressed: y
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24


以上是bash:解析脚本中的F键(F1-F10)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>