다음과 같이 전체 경로에서 파일 이름 부분을 추출합니다.
PATH=/a/b/c/foo.o #1
BASE=${PATH##*/} #2
BASE=${BASE/%.o/-1234.o} #3
echo "$BASE"
#2와 #3을 병합하는 방법이 있나요? 시도할 때마다 bad substitution
bash에서 일종의 오류가 발생합니다.
답변1
예, 모두 변수 이름이 필요하므로 대체 항목을 중첩할 수 없습니다.
그러나 단일 호출로 이 작업을 수행할 수 있습니다 basename
.
base="$( basename "$pathname" .o )-1234.o"
두 번째 매개변수는 basename
주어진 문자열에서 제거될 접미사입니다.
또한 쉘 스크립트에서 PATH
변수에 대문자를 사용하는 것은정말 나쁜 생각이야, 쉘이 이 변수를 사용하여 외부 유틸리티를 찾기 때문입니다.
스크립트에서는 소문자 변수 이름을 사용하십시오. 이는 쉘에서 다른 목적으로 사용하는 쉘 변수 및 환경 변수와의 충돌을 방지하는 데 도움이 됩니다.
답변2
파일 확장자를 알 수 없는 경우(동적) -sed선택하다:
p="/a/b/c/foo.txt"
p=$(sed -E 's#.*/([^/]+)(\..*)$#\1-1234\2#' <<< "$p")
echo "$p"
foo-1234.txt