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