POSIX兼容shell脚本:音量控制if语句逻辑及函数调用问题
POSIX兼容的pactl音量控制脚本(带最大音量限制)
针对i3窗口管理器下用音量键控制音频音量,且需要限制最大音量的需求,以下是完全兼容POSIX标准的实现方案,重点拆解你困惑的if语句逻辑与函数调用结合的写法:
核心脚本实现
#!/bin/sh # 获取当前默认sink的音量(返回整数,不带%) get_current_volume() { pactl list sinks | grep 'Volume:' | head -n 1 | awk '{print $5}' | tr -d '%' } # 配置参数 MAX_VOLUME=100 STEP=5 case "$1" in up) current=$(get_current_volume) # 计算增量后的音量 new=$((current + STEP)) # 判断是否超过最大音量,POSIX标准条件判断语法 if [ "$new" -gt "$MAX_VOLUME" ]; then new=$MAX_VOLUME fi pactl set-sink-volume @DEFAULT_SINK@ "$new%" ;; down) current=$(get_current_volume) new=$((current - STEP)) if [ "$new" -lt 0 ]; then new=0 fi pactl set-sink-volume @DEFAULT_SINK@ "$new%" ;; *) echo "Usage: $0 [up|down]" exit 1 ;; esac
关键逻辑拆解(解决你的if语句困惑)
函数调用与变量赋值
用current=$(get_current_volume)将函数的输出结果赋值给变量,这是POSIX标准的命令替换写法,替代老派的反引号`get_current_volume`,可读性更强。POSIX标准的条件判断语法
- 必须使用
[ ... ]作为条件判断的边界,括号前后必须加空格(否则shell会把它当成命令而非判断符)。 - 算术比较不能直接用
>或<(这两个是shell的重定向符号),必须用POSIX定义的运算符:-gt:大于(greater than)-lt:小于(less than)-eq:等于(equal)
- 变量必须加双引号,比如
[ "$new" -gt "$MAX_VOLUME" ],防止变量为空时出现语法错误。
- 必须使用
算术运算的POSIX写法
用$(( ... ))进行整数运算,这是POSIX标准的算术扩展,内部可以直接写变量和加减操作,无需额外加$(比如current + STEP而非$current + $STEP,不过加了也不影响)。
i3配置绑定
将脚本保存为volume-control并赋予可执行权限(chmod +x volume-control),然后在i3配置文件中添加:
bindsym XF86AudioRaiseVolume exec --no-startup-id /path/to/volume-control up bindsym XF86AudioLowerVolume exec --no-startup-id /path/to/volume-control down bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle
内容的提问来源于stack exchange,提问作者lutz108
相关产品推荐
相关产品推荐

