이 와일드카드 표현은 어떻게/왜 작동하나요?

이 와일드카드 표현은 어떻게/왜 작동하나요?

내 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

관련 정보