이 bash 스크립트를 설명하십시오: echo "${1##*.}"

이 bash 스크립트를 설명하십시오: echo "${1##*.}"

다음 bash 스크립트를 고려하십시오.

#!/bin/bash
echo "${1##*.}" 

파일 이름이 첫 번째 명령줄 인수로 제공되면 이 스크립트는 파일 확장자를 다음과 같이 인쇄합니다.

$ ./script.sh ./file.pdf

위의 경우에 pdf인쇄됩니다 .

${1##*.}이 표현식이 파일 확장자를 추출하는 방법을 설명해주세요 .

(저는 $0, $1, $2, $#이 bash에서 수행하는 작업을 이해하고 정규 표현식도 어느 정도 이해합니다)

답변1

Bash 매개변수 확장은 변수를 확장할 때 값에 대한 다양한 수정을 지원합니다.그 중 하나는##, 값의 가장 긴 접두사를 제거합니다.패턴 일치(모드는아니요정규 표현식은 여기에서).

이 경우 패턴은 입니다 *.. 뒤에 0개 이상의 문자가 있으면 .마지막 ${x##*.}문자까지 모든 문자열을 제거 .하고 해당 지점 이후의 모든 문자를 유지한다는 의미입니다.

${1##*.}는 일반적으로 를 사용하여 액세스하는 첫 번째 위치 매개변수의 값으로 확장하는 것을 의미합니다 $1. 최종 결과는

echo "${1##*.}"

.그런 다음 파일 확장자인 마지막 매개변수 뒤에 스크립트의 첫 번째 매개변수 부분을 인쇄합니다 .

패턴이라면아니요정확한 일치의 경우 변수의 전체 값은 사용하지 않은 것처럼 확장됩니다 ##. 이 경우 제공한 인수가 .전혀 존재하지 않으면 다시 가져옵니다.

Bash는 또한 가장 짧은 일치 접두사를 제거하기 위해 단일 사용을 지원 #하고 %문자열의 끝을 일치시키기 위해 동일한 방법을 사용하는 것을 지원합니다.

답변2

간단한 예:

$ A=my.file.name.txt

$ echo ${A}
my.file.name.txt

$ echo ${A#m}
y.file.name.txt

$ echo ${A#my}
.file.name.txt

$ echo ${A#*.}
file.name.txt

$ echo ${A##*.}
txt

스크립트에서 ${1}은 첫 번째 매개변수이며 동일한 개념이 적용됩니다.

답변3

참고 Bash 매개변수 확장:

# 연산자를 사용하여 머리 부분에서 문자열을 잘라낼 수 있습니다.

% 연산자를 사용하여 꼬리 부분에서 문자열을 잘라낼 수 있습니다.

예를 들어 보겠습니다.

[my->prompt]$ VAR="head:string:tail"
[my->prompt]$ echo ${VAR##*:}               //trim from the head -> till the last ':'
tail
[my->prompt]$ echo ${VAR#*:}                //trim from the head -> till the first ':' 
string:tail
[my->prompt]$ echo ${VAR%%:*}               //trim from the tail <- till the last ':'
head
[my->prompt]$ echo ${VAR%:*}                //trim from the tail <- till the first ':'
head:string
[my->prompt]$ VAR2=${VAR%:*}                //VAR2="head:string"
[my->prompt]$ echo $VAR2
head:string
[my->prompt]$ echo ${VAR2#*:}               //trim from the head -> till the first ':' 
string

관련 정보