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

关于xset输出验证及Bash脚本if变量判断的技术咨询

脚本问题排查与Bash条件判断语法解析

一、原脚本的问题修复

原脚本存在两处核心问题:

  1. 条件判断语法错误:if $foo=1 不符合Bash语法规则,变量比较必须用测试表达式包裹。
  2. 逻辑反转:/sys/class/leds/.../brightness 文件中,值为1代表Numlock处于开启状态(LED点亮),原脚本的提示文本完全相反。

修复后的sysfs版本脚本:

#!/bin/bash
foo=$(cat /sys/class/leds/input3::numlock/brightness)
# 使用[[ ]]进行比较,Bash扩展语法更安全
if [[ $foo -eq 1 ]]; then
    notify-send 'Keyboard alert' 'Numlock On.' --icon=dialog-information
else
    notify-send 'Keyboard alert' 'Numlock Off.' --icon=dialog-information
fi
exit 0

注:input3 可能因系统/键盘型号不同而变化,可通过ls /sys/class/leds/查看实际的Numlock节点路径。

二、用xset检测Numlock状态的通用方案

依赖xset的方式无需关注sysfs路径,兼容性更强,解析xset q的输出即可:

#!/bin/bash
if xset q | grep -q "Num Lock: *on"; then
    notify-send 'Keyboard alert' 'Numlock On.' --icon=dialog-information
else
    notify-send 'Keyboard alert' 'Numlock Off.' --icon=dialog-information
fi

grep -q 为静默匹配模式,只要找到"Num Lock: on"的行,命令返回0(if判定为真),否则返回非0(判定为假)。

三、Bash条件判断的常见写法解析

1. 基础测试:[ ](test命令的别名)

这是POSIX兼容写法,适用于所有Shell:

  • 数字比较:用-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)
    if [ "$foo" -eq 1 ]; then
        # 逻辑代码
    fi
    
    注意:变量必须加双引号避免空值导致语法错误;[ 后、] 前必须留空格。
  • 字符串比较:用=(等于)、!=(不等于)
    if [ "$str" = "hello" ]; then
        # 逻辑代码
    fi
    

2. Bash扩展测试:[[ ]]

仅适用于Bash/Zsh等现代Shell,更灵活安全:

  • 无需给变量加引号,自动处理空值
  • 支持模式匹配(比如[[ $str == h* ]] 匹配以h开头的字符串)
  • 数字比较可用-eq或==
    if [[ $foo == 1 ]]; then
        # 逻辑代码
    fi
    

3. 直接以命令执行结果为条件

if后可直接跟系统命令,命令返回值为0(执行成功)时判定为真,返回非0则为假:

# 检查文件是否存在
if [ -f "/etc/passwd" ]; then
    echo "文件存在"
fi
# 检查用户是否存在
if grep -q "root" /etc/passwd; then
    echo "root用户存在"
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:00:54