比较字符串

比较字符串

我在比较两个字符串时遇到问题。尽管它们在打印时是相同的,但我的 if 语句返回 false。

#!/bin/bash

string1="HDMI"
string2="PC Speaker"

hash=$(pacmd list-sinks | grep active)
echo $hash
trigger="active port: <analog-output-speaker>"
echo $trigger

if [ "$hash" == "$trigger" ]; then
   pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo  
   echo $string1
else
   pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo    
   echo $string2
fi

它产生以下输出:

active port: <analog-output-speaker>
active port: <analog-output-speaker>
Welcome to PulseAudio! Use "help" for usage information.
>>> >>> PC Speaker

答案1

始终引用变量

你说echo $hash ,但这会去除前导和尾随空白并压缩所有内部空间。它不显示变量的内容$hash

相反echo "<$hash>",你会看到前导空格。

看起来脉冲音频在“活动”一词之前使用了一个制表符。因此,在触发器中的值的开头放置一个选项卡,它将起作用。

答案2

如果您添加set -vx#!/bin/bash运行脚本,您将看到:

[[ active port: <analog-output-speaker> == active port: <analog-output-speaker> ]]

您可以看到字符串不一样,因为第一个字符串有一些空格。

用于去除整个字符串的空格您可以使用:trim -d '[[:space:]]

用于去除前导字符串的空格您可以使用:sed -e 's/^[[:space:]]*//'

用于去除字符串尾部的空格您可以使用:sed -e 's/[[:space:]]*$//'

答案3

不可打印的内容让您烦恼。

尝试这个:

$ hash="   active port: <analog-output-speaker>%%%%%"   
$ echo $hash
active port: <analog-output-speaker>%%%%%
$ echo "<$hash>"
<   active port: <analog-output-speaker>%%%%%>
$ if [[ "$hash" =~ "active port" ]]; then echo matched; else echo no match; fi
matched
$ if [[ "$hash" =~ "non active port" ]]; then echo matched; else echo no match; fi
no match

相关内容