Bash脚本显示音量级别异常求助:始终输出‘muted’
修复Bash脚本检测音频音量/静音状态的问题
我尝试编写一个显示当前活跃音频输出设备(active volume sink)音量级别的Bash脚本,但脚本始终显示‘muted’,无法正常工作。以下是原脚本代码:
#!/bin/bash active_sink=$(pacmd list-sinks |awk '/* index:/{print $3}') muted=$(pactl list sinks | perl -000ne 'if(/#${active_sink}/){/(Mute:.*)/; print "$1 "}' | cut -f2 -d':' | cut -f2 -d' ') vol=$(pactl list sinks | perl -000ne 'if(/#${active_sink}/){/(Volume:.*)/; print "$1 "}' | cut -f1 -d'%' | tail -c 3 ) if [[ $muted = "no" ]]; then if [[ $vol -ge 65 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-high.svg echo "$vol%" elif [[ $vol -ge 40 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-medium.svg echo "$vol%" elif [[ $vol -ge 0 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-low.svg echo "$vol%" fi else echo ~/.config/tint2/executors/icons/audio-volume-muted.svg echo "muted" fi
问题根源
Perl命令使用单引号包裹代码时,Bash变量${active_sink}不会被解析替换,Perl实际尝试匹配的是字符串#${active_sink},而非获取到的真实sink索引,导致无法定位到目标设备的状态信息,最终muted变量为空,脚本进入else分支显示muted。
修复后的脚本
#!/bin/bash # 获取当前活跃sink的索引 active_sink=$(pacmd list-sinks | awk '/* index:/{print $3}') # 获取该sink的静音状态(简化逻辑,直接用pactl过滤目标sink) muted=$(pactl list sinks | awk -v sink="$active_sink" '/^Sink #/{current=$2} current==sink && /Mute:/{print $2}') # 获取该sink的音量百分比(取左声道数值) vol=$(pactl list sinks | awk -v sink="$active_sink" '/^Sink #/{current=$2} current==sink && /Volume:/{gsub(/%/,"",$5); print $5}') if [[ $muted = "no" ]]; then if [[ $vol -ge 65 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-high.svg echo "$vol%" elif [[ $vol -ge 40 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-medium.svg echo "$vol%" elif [[ $vol -ge 0 ]]; then echo ~/.config/tint2/executors/icons/audio-volume-low.svg echo "$vol%" fi else echo ~/.config/tint2/executors/icons/audio-volume-muted.svg echo "muted" fi
关键修改说明
- 替换Perl为awk简化逻辑:直接用awk的变量传递功能定位目标sink,避免复杂的多行匹配和管道操作,提升可靠性
- 变量传递方式优化:通过
awk -v sink="$active_sink"将Bash变量传入awk,确保正确匹配目标设备 - 音量提取更精准:直接提取左声道的音量数值(
$5对应Volume: front-left: X%中的X),避免tail -c 3可能带来的格式问题 - 修复条件判断缩进:统一代码缩进,提升可读性
内容的提问来源于stack exchange,提问作者lignjoslav
相关产品推荐
相关产品推荐

