문자열이 있고 여기에 하위 문자열이 포함되어 있는지 확인하고 싶습니다. 그래서 저는 이 명령을 사용하고 있습니다. 아래는 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
${STRING!/substr/}
substr
$STRING1
$STRING1
substr
및 둘 다 표준 구문 [[...]]
은 아니지만 명령과 연산자(후자도 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
.