bash 기능: 파일 이름과 확장자 분할

bash 기능: 파일 이름과 확장자 분할

split내 .bash_profile 파일에는 다음 기능이 있습니다.

function split {
   name="${$1%.*}"
   ext="${$1##*.}"
   echo filename=$name extension=$ext
}

이제 나는 그 명령이 split foo.bar나에게 주어질 것을 기대해야 합니다.

filename=foo  extension=bar

하지만 오류 메시지가 나타납니다 -bash: ${$1%.*}: bad substitution. 그러나 예를 들어 .bash_profile의 변수 $x가 아닌 쉘 스크립트의 일반 쉘 변수에도 동일하게 적용됩니다 $1(.bashrc에서도 동일하다고 가정합니다).

무엇이 문제이고 해결 방법이 있나요?

답변1

매개변수 확장에서 $앞의 변수 이름( )을 제거합니다.1

name="${1%.*}"
ext="${1##*.}"

앞의 여는 중괄호를 통해 이미 $변수를 참조 했으므로 {변수 이름 앞에 다른 중괄호를 추가할 필요가 없습니다.

답변2

dirname및 명령이 있는 경우 이 함수 정의를 고려할 수 있습니다 basename.awk

function split {

DIR=$(/bin/dirname "$1")
BASE=$(/bin/basename "$1")
EXT=$(echo "$BASE" | /usr/bin/awk -F. 'NF>1 {print $NF}')
NAME=${BASE%.$EXT}
echo directory=$DIR filename=$NAME extension=$EXT

}

split good.bye/data.txt
split good.bye/data
split data.txt
split good.bye/data.001.txt
split "good bye/data 001.txt"

관련 정보