내 Bash 스크립트 중 하나에서 콜론으로 구분된 문자열의 마지막 부분을 가져와야 합니다. 예를 들어 289283
다음에서 숫자 값을 가져와야 합니다 .
OK: DriveC-ReadBytesPerSec: 289283
몇번의 시행착오 끝에 저는 다음과 같은 결론에 도달했습니다.
READRESULT="OK: DriveC-ReadBytesPerSec: 289283"
echo ${READRESULT#*:*:*}
어느 출력 289283
.
문제는 작업을 수행하는 동안 왜 ${READRESULT#*:*:*}
올바른 결과가 나오는지 완전히 이해하지 못한다는 것입니다.
이 와일드카드 표현이 어떻게 작동하는지 설명할 수 있는 사람이 있나요?
답변1
에서 man bash
:
${매개변수#단어}
${매개변수##단어}일치하는 접두사 패턴을 제거합니다. 경로 이름 확장과 마찬가지로 단어가 확장되어 패턴을 생성합니다. 패턴이 매개변수 값의 시작 부분과 일치하는 경우 확장 결과는 가장 짧은 일치 패턴(case
#
) 또는 가장 긴 일치 패턴(##
case)이 제거된 매개변수의 확장된 값입니다.
귀하의 패턴은 *:*:*
이며 bash
가장 짧은 일치 접두사를 제거하려고 시도합니다.
OK:
1위를 위해*:
DriveC-ReadBytesPerSec:
두번째*:
- 마지막 항목은
*
가장 짧은 일치 항목에 대해 작동하므로 아무것도 없습니다.
비교하다:
$ # shortest match without surplus *
$ echo ${READRESULT#*:*:}
289283
$ # going for longest match now; the last * will swallow the number
$ echo ${READRESULT##*:*:*}
$ # longest match without the last *
$ echo ${READRESULT##*:*:}
289283
$ # no need to repeat *: because * matches everything before the last : anyway
$ echo ${READRESULT##*:}
289283