![比较字符串](https://linux22.com/image/5087/%E6%AF%94%E8%BE%83%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我在比较两个字符串时遇到问题。尽管它们在打印时是相同的,但我的 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