문자열에 하위 문자열이 포함되어 있는지 테스트

문자열에 하위 문자열이 포함되어 있는지 테스트

코드가 있습니다

file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
    echo "True"
else
    echo "False"
fi

file"gen"이 포함되어 있는지 테스트합니다 . 출력은 "거짓"입니다. 좋아요!

문제는 "gen"을 변수로 바꿀 때입니다 testseq.

file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
    echo "True"
else
    echo "False"
fi

이제 출력은 "True"입니다. 어떻게 그래? 이 문제를 어떻게 해결하나요?

답변1

연산자를 사용한 정규식 비교 =~:

#!/bin/bash
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file =~ $testseq ]];
then
    echo "True"
else
    echo "False"
fi

이런 식으로 내용이 있는지 여부를 비교합니다 $file.$testseq

user@host:~$ ./string.sh
False

내가 변경하면 testseq="Const":

user@host:~$ ./string.sh
True

그러나 먹는 것에 주의하십시오 $testseq. 해당 문자열이 어떤 방식으로든(예: ) 정규식을 나타내는 경우 [0-9]"일치"가 트리거될 가능성이 더 높습니다.

인용하다:

답변2

$testseq변수를 삽입하려면 다음 방법 중 하나를 사용해야 합니다 .

  • $file == *_"$testseq"_*(여기서는 $testseq고정 문자열로 간주)

  • $file == *_${testseq}_*(여기서는 $testseq패턴으로 간주됩니다).

또는 _변수 이름 바로 뒤에 오는 문자는 변수 이름의 일부로 간주됩니다(변수 이름에서 유효한 문자입니다).

답변3

file="JetConst_reco_allconst_4j2t.png"
testseq="gen"

case "$file" in
    *_"$testseq"_*) echo 'True'  ;;
    *)              echo 'False'
esac

를 사용하는 것은 case ... esac이식 가능한 방식으로 패턴 일치를 수행하는 가장 쉬운 방법 중 하나입니다. 다른 언어에서는 "스위치" 문으로 사용됩니다( bash, zsh, , ksh93또한 다음을 수행할 수 있습니다.떨어지다다양한 호환되지 않는 방식으로). 사용되는 패턴은 표준 파일 이름 와일드카드 패턴입니다.

발생한 문제는 _변수 이름의 문자가 유효하기 때문에 발생합니다. 따라서 쉘은 *_$testseq_*" *_변수 값의 합계 $testseq_" 를 보게 됩니다 *. 변수는 $testseq_정의되지 않았으므로 빈 문자열로 확장되고 로 끝납니다 *_*. 이는 분명히 $file가지고 있는 값과 일치합니다. 결과 True파일 이름에 $file밑줄이 하나 이상 포함될 것으로 예상할 수 있습니다.

변수 이름을 적절하게 구분하려면 "..."확장명을 사용하십시오: *_"$testseq"_*. 변수의 값을 문자열로 사용합니다. 변수의 값을 다음과 같이 사용하고 싶습니다.무늬, *_${testseq}_*대신 사용하세요.

또 다른 빠른 수정은 값에 밑줄을 포함하는 것입니다 $testseq.

testseq="_gen_"

그런 다음 패턴으로 사용됩니다 *"$testseq"*(문자열 비교용).

답변4

문자열에 하위 문자열이 포함되어 있는지 테스트하는 이식 가능한 방법의 경우 다음을 사용하십시오.

file="JetConst_reco_allconst_4j2t.png";       testseq="gen"

[ "${file##*$testseq*}" ] || echo True Substring is present

아니면 "${file##*"$testseq"*}"설명을 피하세요 testseq.

관련 정보