이 bash 코드를 이해하는 데 도움이 필요합니다: "${i%.*}_MYSUFFIX.${i##*.}"

이 bash 코드를 이해하는 데 도움이 필요합니다: "${i%.*}_MYSUFFIX.${i##*.}"
for i in *.shp; do ; mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}" ; done

이 루프는 _MYSUFFIX내 디렉터리의 파일 확장자 앞에 삽입됩니다. 훌륭한 기능이지만 자세한 내용을 이해하는 데 어려움을 겪고 있습니다.

"${i%.*}_MYSUFFIX.${i##*.}"

캐릭터 확장/교체? ? ? 이것을 배우기 위해 설명과 문서를 어디서 찾아야할지 모르겠습니다.

답변1

i포함되어 있다고 가정하고 testing.an.string.with.dots.shp이해하지 못하는 부분에 공백을 추가하고 결과를 확인하세요.

$ echo "${i%.*}   _MYSUFFIX.    ${i##*.}"
testing.an.string.with.dots   _MYSUFFIX.    shp

따라서 이러한 "매개변수 확장"은 bash 매뉴얼에서 찾을 수 있습니다.

LESS=+/#word man bash

링크는 "일치하는 접두사 패턴 제거" 항목으로 이동하고 다음 항목은 "일치하는 접미사 패턴 제거"입니다. 이름은 각 사람의 역할을 암시합니다. 하나는 변수(매개변수) 내용 앞부분의 문자를 제거하고, 다른 하나는 끝(꼬리)의 문자를 제거합니다.

단일 문자를 사용 #하거나 %더 짧은 일치 부분을 제거하세요.

문자를 두 배로 늘리 ##거나 %%일치하는 가장 긴 부분을 제거하세요.

따라서 a 는 점( )으로 시작하는 끝부터 끝까지 가장 짧은 문자열을 제거하여 재생산합니다 "${i%.*}". 이것은 단순히 "확장자(및 점) 제거"를 의미합니다.$i.

A는 뒤에 점이 오는 항목과 일치하는 가장 긴 문자열을 앞에서 제거하면서 "${i##*.}"값을 재현합니다 . $i간단히 말하면 확장자만 유지하세요.

그런 다음 세 부분이 모두 하나의 문자열로 연결됩니다.

답변2

그래서 매뉴얼에서 tl;dr:

i=bob.was.here.shp
nameFront="${i%.*}" # Deletes shortest match of ".*" from back of $i, one "." only
echo Front=$nameFront
nameExt=${i##*.}    # Deletes longest match of "*." from front of $i, so include "."'s
echo Ext=$nameExt
echo New="${nameFront}_MYSUFFIX.${nameExt}"


Giving:
Front=bob.was.here
Ext=shp
New=bob.was.here_MYSUFFIX.shp

답변3

"Bash의 문자열 작업"이라고 합니다.

여기에 관한 아주 좋은 교과서가 있습니다.
https://tldp.org/LDP/abs/html/string-manipulation.html

관련 정보