$STRING1 != Linux의 "${STRING1/substr/}"

$STRING1 != Linux의 "${STRING1/substr/}"

문자열이 하나 있는데 여기에 하위 문자열이 포함되어 있는지 확인하고 싶습니다. 그래서 저는 이 명령을 사용하고 있습니다. 아래는 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/}됩니다 .$STRING1substr

[[ string = pattern ]][[ string != pattern ]]문자열을 패턴과 일치시키는 또 다른 ksh 특정 구성입니다 . 패턴이 인용되면 문자 그대로 받아들여지며 [[ string = "string" ]]항등 연산자도 마찬가지입니다(와 부등호 !=).

따라서 [[ $STRING1 != "${STRING1/substr/}" ]]명령은 확장하여 다른 문자열을 생성하는 경우 true를 반환합니다. $STRING1이는 inside ${STRING!/substr/}가 한 번 이상 발생한 경우에만 발생할 수 있으므로 가 포함되어 있는지 확인하는 방법입니다 .substr$STRING1$STRING1substr

표준 구문 도 아니고 표준 구문 [[...]]도 아니지만 명령과 연산자(후자는 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.

관련 정보