$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}$varpattern대체된 값 의 첫 번째 항목으로 확장되는 ksh 인수 확장 연산자입니다 replacement.

첫 번째 발생의 경우에도 마찬가지이며 ${STRING1/substr/}대체된 항목이 없으므로 삭제되었습니다.$STRING1substr

[[ string = pattern ]][[ string != pattern ]]문자열을 패턴과 일치시키는 데 사용되는 또 다른 ksh 관련 구성입니다 . 패턴이 인용되면 [[ string = "string" ]]동등 연산자(부등식도 포함)와 마찬가지로 문자 그대로 간주됩니다 !=.

따라서 명령은 [[ $STRING1 != "${STRING1/substr/}" ]]확장이 다른 문자열을 생성하고 내부가 적어도 한 번 발생하는 경우에만 발생하는 경우 true를 반환하므로 이것이 포함을 확인하는 방법입니다.$STRING1${STRING!/substr/}substr$STRING1$STRING1substr

및 둘 다 표준 구문 [[...]]은 아니지만 명령과 연산자(후자도 ksh에서 유래)는 표준 구문입니다. 따라서 때로는 다음과 같은 코드가 표시됩니다.${var/pattern/replacement}sh[${var#pattern}

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

이는 변수에 하위 문자열이 포함되어 있는지 확인하는 표준(Bourne은 아니지만) 방법이지만 복잡하고 명백한 명령문 접근 방식에 비해 case장점이 없습니다 .

답변2

하위 문자열이 포함되어 있는지 확인하세요.

구현하기가 더 쉬울 것 같습니다.

[ -z "${s##*substr*}" ] && echo Substring is present

있는 경우 확장 결과 ${…}는 null(길이 0)입니다.substr


... if 문의 조건은 어떻게 작동합니까? 이것

if [[ $STRING1 != "${STRING1/substr/}" ]]; then

두 문자열이 비교되고 있습니다. 수정되지 않은 원래 문자열과 substr제거된 동일한 문자열( /substr/})입니다. 다르면( !=) 원래 문자열에 가 포함됩니다 substr.

관련 정보