You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Bash热键脚本改写求助:CapsLock联动Unicode输入问题

解决Linux下Bash脚本检测CapsLock及Alt组合键输出问题

1. 检测CapsLock激活状态的逻辑

在Linux系统中,可通过xset q命令获取键盘状态,从中过滤Caps Lock的激活状态。判断逻辑如下:

if xset q | grep -q "Caps Lock:\s*on"; then
    # CapsLock处于激活状态
else
    # CapsLock未激活
fi

grep -q会静默执行,只要匹配到"Caps Lock: on"(忽略中间空格),就返回0,进入if分支。

2. 正确处理Alt+字母的按键组合

原脚本中read -n 1仅能读取单个字符,但Alt+字母的输入是ESC+对应字母的两字节序列(比如Alt+a是\033a),因此需要读取完整的两字节序列。可改用read -r -s -n 2来处理:-r禁止反斜杠转义,-s隐藏输入的ESC字符,-n 2指定读取两个字符。

同时,case分支无需添加*,直接匹配固定的两字节序列即可,比如$'\033A'对应Alt+A,$'\033a'对应Alt+a。

完整修改后的脚本

#!/bin/bash

while :
do
    # 读取Alt+字母的两字节序列,隐藏输入避免显示ESC字符
    read -r -s -n 2 key_seq

    # 检测CapsLock状态并输出对应字符
    if xset q | grep -q "Caps Lock:\s*on"; then
        case "$key_seq" in
            $'\033A') echo -e '\u00C5';; # Å(Alt+A,CapsLock激活)
            $'\033E') echo -e '\u00C6';; # Æ(Alt+E,CapsLock激活)
            $'\033O') echo -e '\u00D8';; # Ø(Alt+O,CapsLock激活)
            $'\033U') echo -e '\u016E';; # Ů(Alt+U,CapsLock激活)
        esac
    else
        case "$key_seq" in
            $'\033a') echo -e '\u00E5';; # å(Alt+a,CapsLock未激活)
            $'\033e') echo -e '\u00E6';; # æ(Alt+e,CapsLock未激活)
            $'\033o') echo -e '\u00F8';; # ø(Alt+o,CapsLock未激活)
            $'\033u') echo -e '\u016F';; # ů(Alt+u,CapsLock未激活)
        esac
    fi
done

内容的提问来源于stack exchange,提问作者Blu3Rat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:30:34