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