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

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

关键修改说明

  1. 替换Perl为awk简化逻辑:直接用awk的变量传递功能定位目标sink,避免复杂的多行匹配和管道操作,提升可靠性
  2. 变量传递方式优化:通过awk -v sink="$active_sink"将Bash变量传入awk,确保正确匹配目标设备
  3. 音量提取更精准:直接提取左声道的音量数值($5对应Volume: front-left: X%中的X),避免tail -c 3可能带来的格式问题
  4. 修复条件判断缩进:统一代码缩进,提升可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:21