文字列比較

文字列比較

2つの文字列を比較するのに問題があります。印刷時に同じであっても、私の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>"先行スペースが表示されます。

Pulse Audioが「アクティブ」という単語の前にタブを使用しているようです。したがって、トリガーの値の先頭にタブを置くと機能します。

答え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

関連情報