关于xset输出验证及Bash脚本if变量判断的技术咨询
脚本问题排查与Bash条件判断语法解析
一、原脚本的问题修复
原脚本存在两处核心问题:
- 条件判断语法错误:
if $foo=1不符合Bash语法规则,变量比较必须用测试表达式包裹。 - 逻辑反转:
/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
相关产品推荐
相关产品推荐

