두 문자열을 비교하는 데 문제가 있습니다. 인쇄할 때 동일하더라도 내 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가 "active"라는 단어 앞에 탭을 사용하는 것 같습니다. 따라서 트리거의 값 시작 부분에 탭을 넣으면 작동합니다.
답변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