문자열 비교

문자열 비교

두 문자열을 비교하는 데 문제가 있습니다. 인쇄할 때 동일하더라도 내 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

관련 정보