쉘 스크립트에서 "${line#*'Caused By'}" != "$line"은 무엇을 의미합니까?

쉘 스크립트에서 "${line#*'Caused By'}" != "$line"은 무엇을 의미합니까?

누군가 쉘 스크립트에서 이것이 무엇을 의미하는지 설명할 수 있습니까?

while read -r line
do 
  if [ "${line#*'Caused By'}" != "$line" ]; then
    echo "Yes"
  fi
done       

답변1

${line#*'Caused By'}변수 대체의 특정 인스턴스입니다 ${parameter#word}( bash매뉴얼에 기록된 대로).POSIX 표준에서sh쉘 의 경우 ).

에서는 값의 시작 부분부터 ${parameter#word}패턴이 제거됩니다 . 제거하기 때문에 "최소 접두사 패턴 제거"라고 합니다.word$parameter가장 짧은word(의 패턴과 일치하는 일치하는 접두사 문자열 로 ##대체하여 #제거됩니다 .가장 긴접두사 문자열과 일치).

이 특정 예에서는 문자열 Caused by(및 그 이전의 모든 항목 *)이 있는 경우 값에서 제거됩니다 $line. 문자열 주위의 작은따옴표는 중복됩니다.

대체 결과를 변수 자체의 값과 비교하고, 텍스트 가 있으면 인쇄하여 결정된 값에 $line텍스트가 포함되어 있는지 테스트합니다.Caused byYes

이는 다음과 같은 효과가 있습니다.

if [[ "$line" == *'Caused by'* ]]; then
    echo 'Yes'
fi

bash, 또는 ksh93, zsh또는

case "$line" in
    *'Caused by'*) echo 'Yes'
esac

어떤 sh껍질에서든.


질문의 루프는 표준 입력에서 "라인"을 읽습니다. 질문 참조 ""IFS=read-r-line" 이해 "이것에 대해 토론해 보세요.

답변2

if 조건의 왼쪽을 사용하세요패턴 매칭배쉬 기능. 일치하는 문자열에 "Caused By"가 포함되어 있으면 해당 문자열이 삭제됩니다. 행은 더 이상 이전과 동일하지 않으므로 if 절이 트리거되지 않습니다.

다음은 셸에서 실행할 수 있는 예입니다.

echo -e "Number 1 Caused by me.\nNumber 2 is normal.\n" |
  while read line; do
    echo "${line#*'Caused by'}"
  done

결과:

 me.
Number 2 is normal.

답변3

작업(또는 이 경우 실행)은 항상 더 중요하므로 실행 시 이 스크립트가 수행하는 작업을 살펴보겠습니다(출력을 더 장황하게 만드는 것에 대해 양해해 주세요).

while read -r line
do 
  if [ "${line#*'Caused by'}" != "$line" ]; then
    echo "Line contains string Caused by"
  else
    echo "Line does not contain string Caused by"
  fi
done

Input: String with Caused by
Output: Line contains string Caused by
Input: Just a normal string
Output: Line does not contain string Caused by

이 스크립트에 사용된 패턴 일치는 "${line#*'Caused by'}모든 문자열을 처음부터 끝까지 바꾸는 것입니다(와일드카드로 인해).*원인입력 행에 있는 매개 $line변수를 원래 매개변수와 비교하여 동일한지 확인합니다. 간단히 말해서, 행에 문자열이 포함되어 있는지 확인하는 것뿐입니다.원인. 마지막으로 인쇄해 보세요.이 줄에는 문자열이 포함되어 있습니다.행에 다음이 포함된 경우원인.

${parameter#word}이제 몇 가지 예와 함께 형식의 셸 매개변수 확장에 대해 간략하게 소개합니다.

패턴이 매개변수 값의 시작 부분과 일치하는 경우 확장 결과는 가장 짧은 일치 패턴("#" 케이스) 또는 가장 긴 일치 패턴("##" 케이스)이 제거된 매개변수 확장 값입니다.

$ test=aabbcc
$ echo ${test#*bb}                                                                    
$ cc

$ test=aabbcc
$ echo ${test#a*b}                                                                    
$ bcc

가장 긴 일치 패턴 형식의 예:

$ test=aabbcc
$ echo ${test##a*b}                                                                     
$ cc

인용하다: man bash:${parameter#word}

관련 정보