繁体   English   中英

if 语句,调用 function 并将值与变量进行比较

[英]if statement, that calls a function and compares values to variables

我使用 i3 并想使用调用 pactl 的音量键来控制我的接收器的音量。 由于 pactl 不支持最大音量参数,但建议与 pipwire 一起使用,脚本应该获取当前音量并进行比较,如果下一个 volume_increment 步骤会导致比某个 max_volume 更高的值。 我的困惑现在与 if 语句有关,结合计算 volume_increment 和 max_volume 之间的差异,并将其与 current_volume function 的结果进行比较。因此音量将提高,直到某个值,其中增量将导致音量高于最大值

#!/bin/bash

volume_increment=$1
max_volume=$2

function get_volume() {
pactl get-sink-volume @DEFAULT_SINK@ | head -n1 | cut -d/ -f2 | tr -d ' %'
}
 
if (( get_volume >= $max_volume - $volume_increment )) ; then
    pactl set-sink-volume @DEFAULT_SINK@ +$volume_increment%
else
    pactl set-sink-volume @DEFAULT_SINK@ $max_volume%
fi

我在 google 上搜索了很多,并在 if 语句中尝试了几种括号变体。 我已经设法让它在某个中间步骤工作。 但是后来我读到 (()) 括号对于 POSIX shell 并不通用。

现在我很困惑,无法在脑海中区分这些不同的方面。 有人会如此友好地解释在语句中调用 function 的逻辑并将其与变量的差异进行比较吗? 最好用于通用 POSIX 用法,螺母 bash 特定。

请注意,在算术上下文中,变量是隐式扩展的。 因此, ((var))自动使用$var

在你的声明中

(( get_volume >= $max_volume - $volume_increment ))

不需要 $ - 您同样可以编写max_volume - volume_increment ,但您指的是变量get_volume并且从未设置它。 未设置的变量被视为零,因此get_volume始终为 0。假设您可以从 function current_volume计算此值,您可以执行

get_volume=$(current_volume)

或者直接在算术表达式中运行这个 function,即

(( $(current_volume) >= $max_volume - $volume_increment ))

当然,所有这些都要求您在脚本中将自己限制为 integer 算术。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM