누군가 쉘 스크립트에서 이것이 무엇을 의미하는지 설명할 수 있습니까?
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 by
Yes
이는 다음과 같은 효과가 있습니다.
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}