문자열이 하나 있는데 여기에 하위 문자열이 포함되어 있는지 확인하고 싶습니다. 그래서 저는 이 명령을 사용하고 있습니다. 아래는 Linux 쉘 스크립트입니다. if 문에 있는 조건이 어떻게 작동하는지 알고 싶습니다.
STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
echo "Substring is present"
fi
답변1
이는 표준을 작성하는 복잡하고 ksh 관련(현재는 몇 가지 다른 쉘에서 지원됨) 방법입니다.
case $STRING1 in
*substr*) echo Substring is present
esac
또는 ksh 특정:
if [[ $STRING1 = *substr* ]]; then
echo Substring is present
fi
${var/pattern/replacement}
$var
는 의 첫 번째 항목이 pattern
로 대체된 값으로 확장되는 ksh 매개변수 확장 연산자입니다 replacement
.
처음으로 아무것도 교체되지 않은 경우 도 마찬가지이므로 제거 ${STRING1/substr/}
됩니다 .$STRING1
substr
[[ string = pattern ]]
[[ string != pattern ]]
문자열을 패턴과 일치시키는 또 다른 ksh 특정 구성입니다 . 패턴이 인용되면 문자 그대로 받아들여지며 [[ string = "string" ]]
항등 연산자도 마찬가지입니다(와 부등호 !=
).
따라서 [[ $STRING1 != "${STRING1/substr/}" ]]
명령은 확장하여 다른 문자열을 생성하는 경우 true를 반환합니다. $STRING1
이는 inside ${STRING!/substr/}
가 한 번 이상 발생한 경우에만 발생할 수 있으므로 가 포함되어 있는지 확인하는 방법입니다 .substr
$STRING1
$STRING1
substr
표준 구문 도 아니고 표준 구문 [[...]]
도 아니지만 명령과 연산자(후자는 ksh에서 나온 것임)가 표준입니다. 따라서 때때로 다음과 같은 코드가 표시됩니다.${var/pattern/replacement}
sh
[
${var#pattern}
if [ "$STRING1" != "${STRING1#*substr*}" ]; then
echo Substring is present
fi
case
이는 변수에 하위 문자열이 포함되어 있는지 확인하는 표준(Bourne은 아니지만) 방법이지만 다시 복잡하고 명백한 명령문 접근 방식 에 비해 이점이 없습니다 .
답변2
하위 문자열이 포함되어 있는지 확인하십시오.
실행하기가 더 간단한 것 같습니다.
[ -z "${s##*substr*}" ] && echo Substring is present
확장 결과 ${…}
는 null(길이 0)입니다 substr
.
... if 문에 있는 조건은 어떻게 작동합니까? 그만큼
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
수정되지 않은 원본 문자열과 제거된 동일한 문자열 substr
( /substr/}
)의 두 문자열을 비교합니다. 서로 다른 경우( !=
), 원래 문자열에는 가 포함됩니다 substr
.