Bash 等效性斗争

Bash 等效性斗争

我在这次 Bash 中哪里做错了?

declare current_state=`pacmd list-sources | sed -n 19p`
declare my_target='used by: 0'
echo $current_state = $my_target
if [ '$current_state' = '$my_target' ] ; then
    echo true
    pacmd set-default-sink "alsa_output.pci-0000_0c_00.4.analog-stereo"
    echo true
else
    echo false
    pacmd set-default-sink "alsa_output.pci-0000_0a_00.1.hdmi-stereo-extra2"
    echo false
fi

它始终向终端输出 else (false) 选项:

used by: 0 = used by: 0
false
false

我已经尝试过、、、、if [[ '$current_state' = '$my_target' ]]等。但结果总是错误。if [[ '$current_state' == '$my_target' ]]if [ '$current_state' == '$my_target' ]if [ '$current_state' == 'used by 0:' ]if [ '$current_state' = 'used by 0:' ]

为了便于理解,我尝试使用以下脚本如何使用快捷键切换声音输出但这些都不起作用,因为我的输出索引是 2、3 和 30。因为这是有道理的。无论如何,我发现通过运行 pacmd list-sources,同时改变手动选择的输出,从声音设置中得出几行差异。(第 6 行是我最初尝试的,它会将索引 2 之一(第一个,是的,第一个)的状态报告为state: IDLEstate: RUNNINGstate: SUSPENDED。)我设法让 bash 脚本工作一次从耳机切换到显示器,然后就不行了。所以我尝试将我查看的位置更改为第 19 行输出,该输出告诉我它是否在使用中(我认为),无论是used by: 1在活动时还是used by: 0在非活动时都可以切换。但是没有,没有运气。

因此,我开始进行基本的故障排除,以确保我的 if/else 评估正确,但事实并非如此。我不知道我在这里应该做什么。我是不是搞砸了声明?我不知道。

答案1

pacmd list-sources通常会导致行以空格/制表符开头...这可能会导致您比较的两个字符串不相等...空格也算数。

您可以使用=~部分匹配,例如尝试[ " abc: 1" = "abc: 1" ] && echo "full match" || [[ " abc: 1" =~ "abc: 1" ]] && echo "partial match"...注意字符串和子字符串的顺序=~以及使用[[ ... ]]

因此修改您的代码:

#!/bin/bash

current_state=$(pacmd list-sources | sed -n 19p)
my_target="used by: 0"
echo "$current_state" = "$my_target"
if [[ "$current_state" =~ "$my_target" ]] ; then
    echo true
    pacmd set-default-sink "alsa_output.pci-0000_0c_00.4.analog-stereo"
    echo true
else
    echo false
    pacmd set-default-sink "alsa_output.pci-0000_0a_00.1.hdmi-stereo-extra2"
    echo false
fi

相关内容