Bash의 매개변수 확장은 일치 항목을 어떻게 평가합니까?

Bash의 매개변수 확장은 일치 항목을 어떻게 평가합니까?

나는 읽었다"리눅스 성경 10판",7장: 간단한 쉘 스크립트 작성, 149페이지, "Bash의 매개변수 확장" 단락.

  • ${var:-value}— 변수가 설정되지 않았거나 비어 있으면 값으로 확장합니다.
  • ${var#pattern}- var 값의 시작 부분에서 가장 짧은 패턴 일치를 자릅니다.
  • ${var##pattern}- var 값의 시작 부분부터 가장 긴 패턴 일치를 가져옵니다.
  • ${var%pattern}— var 값의 끝에서 가장 짧은 패턴 일치를 자릅니다.
  • ${var%%pattern}- var 값의 끝에서 가장 긴 패턴 일치를 자릅니다.

어떻게 설명해주세요.가장 길다/가장 짧다일치 항목이 계산되나요? 오른쪽에서 왼쪽으로 아니면 그 반대인가요?

또한 아래 코드의 작동 방식과 출력 계산 방법을 설명해 주세요.

MYFILENAME=”/home/digby/myfile.txt”—Sets the value of MYFILENAME 
FILE=${MYFILENAME##*/}—FILE becomes "myfile.txt" 
DIR=${MYFILENAME%/*}—DIR becomes "/home/digby" 
NAME=${FILE%.*}—NAME becomes "myfile" 
EXTENSION=${FILE##*.}—EXTENSION becomes "txt"

감사해요.

답변1

정면에서 잘라낸 "#" 케이스부터 시작하겠습니다. 예를 들어 문자열을 문자열("0개 이상의 문자" 뒤에 마침표가 있음을 의미)과 일치시키는 myfile.tar.gz경우 두 가지 일치 항목이 있습니다: 및 . 이것*.myfile.myfile.tar.가장 짧은일치하는 내용은 다음과 같습니다.

${MYFILENAME#*.} # ie myfile.

결과는 다음과 같습니다: tar.gz. 이것가장 긴일치하는 내용은 다음과 같습니다.

${MYFILENAME##*.} # ie myfile.tar.

결과는 다음과 같습니다: gz.

이제 "%"의 경우를 고려해보자. 여기서 일치 항목은 문자열의 오른쪽에 있습니다. 이번에는 .*뒤에 문자가 있는(또는 없는) 지점을 찾고 있습니다. 가장 짧은 일치 항목이 .gz가장 긴 항목 이므로 .tar.gz다음과 같은 결과를 얻습니다.

${MYFILENAME%.*}  # => myfile.tar
${MYFILENAME%%.*} # => myfile

다른 예는 이 점을 설명하기 위해 테마를 변형한 것입니다.

MYFILENAME=”/home/digby/myfile.txt”—Sets the value of MYFILENAME 
FILE=${MYFILENAME##*/}—FILE becomes "myfile.txt" 
DIR=${MYFILENAME%/*}—DIR becomes "/home/digby" 
NAME=${FILE%.*}—NAME becomes "myfile" 
EXTENSION=${FILE##*.}—EXTENSION becomes "txt"

설명하다:

  1. */처음부터 일치하는 가장 긴 문자열은 다음과 같습니다./home/digby/
  2. /*마지막에 일치하는 가장 짧은 문자열은 다음과 같습니다./myfile.txt
  3. 마지막에 .*와 일치하는 가장 짧은 문자열은 다음과 같습니다..txt
  4. at the front is"*.myfile.`과 일치하는 가장 긴 문자열

관련 정보