다음 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