
코드가 있습니다
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
.