견고하게 경로 구축

견고하게 경로 구축

쉘 스크립트(예: zsh)에 여러 변수가 있다고 가정해 보겠습니다.

FOLDER_1, FOLDER_2, etc.

/예를 들어 경로가 있는 경우 이러한 변수는 에서 참조됩니다 ./home/me/stuff/items

변수는 다음과 같습니다.

FOLDER_1='home'
FOLDER_2='me'
FOLDER_3='stuff'

이제 변수를 연결하여 해당 경로를 재구성한다고 가정해 보겠습니다. 한 가지 가능한 접근 방식은 다음과 같이 경로를 구축하는 것입니다.

PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/

그러나 일부 변수에는 FOLDER_i슬래시가 있고 다른 변수에는 없는 경우(어떤 변수인지는 알 수 없음)를 가정해 보겠습니다.

FOLDER_1='home'
FOLDER_2='stuff/'
FOLDER_3='items'

내 질문은 다음과 같습니다어떻게 경로를 견고하게 구축할 수 있습니까?(예: 이중 슬래시를 피하고 필요한 곳에 추가하십시오).

/이를 수행하는 한 가지 방법 은 항상 변수 쌍 사이에 추가한 다음 을 사용하여 중복 항목을 제거하는 것이라고 생각했지만 sed작동하도록 할 수 없습니다( /올바르게 수행하고 있는지 확실하지 않습니다 sed).

반품,나는 바퀴를 재발명하고 있는가?? (즉, 이 작업을 수행하는 내장 함수가 있습니까?)

마지막으로 변수가 있는 경우대량으로, 예를 들어 FOLDERS, 루핑 없이 이 작업을 수행할 수 있습니까? (또는 반복하지만 FOLDERS배열에 몇 개가 있는지 알지 못함)

답변1

간단한 대답은 걱정을 멈추고 멀티 슬래시를 좋아하는 것입니다.여러 개의 슬래시는 단일 슬래시와 동일한 효과를 갖습니다.(다음으로 시작하는 경로는 //일부 시스템에서 다른 의미를 갖습니다. Windows의 Unix 에뮬레이션 계층은 제가 이름을 붙일 수 있는 유일한 계층입니다.) 이는 의도적으로 설계된 것입니다. 슬래시 여러 개에 대해 걱정할 필요 없이 파일 이름을 결합할 수 있다는 것이 디자인 결정의 주요 부분이었습니다.

배열 요소를 연결하려면 zsh에서 다음을 사용할 수 있습니다.j 매개변수 확장 플래그.

dir=${(j:/:)FOLDERS}

이 작업을 수행하는 동안 반복되는 슬래시를 스쿼시할 수 있지만 이는 순전히 장식용입니다.

setopt extended_glob
dir=${${(j:/:)FOLDERS}//\/\/##/\/}

$IFSksh와 bash에서는 첫 번째 문자를 구분 기호로 사용하여 배열을 연결할 수 있습니다. 그런 다음 반복되는 슬래시를 스쿼시할 수 있습니다. Bash에서는 shopt -s extglob아래 코드 조각의 마지막 줄에서 ksh 전역 변수를 활성화 해야 합니다 .

IFS=/
dir="${FOLDERS[*]}"
unset IFS
dir=${dir//\/+(\/)//}

답변2

printf배열과 함께 사용할 수 있습니다 .

parts=("$FOLDER_1" "$FOLDER_2" "$FOLDER_3");
printf '/%s' "${parts[@]%/}"
# Use "printf -v path" to save it into a variable called "path" instead of printing it

연산자는 %후행 문자열(이 경우 )을 자릅니다 /. 이를 적용하면 parts[@]각 배열 구성원을 개별적으로 자릅니다.

이 기술을 이해하는 열쇠 printf는 다음과 같습니다 man 1 printf. "형식 문자열은 매개변수를 만족시키기 위해 필요한 만큼 자주 재사용됩니다."

답변3

sed당신에게 어울리지 않나요? sed 's|/\+|/|g'연결한 후 또는 연결하기 전에 시도해 보세요 sed 's|/||g'.

답변4

bash 4${var....}기본적으로 매개변수 대체 ...off에서 정규식 일치를 활성화하는 확장된 와일드카드가 도입되었습니다 . 스크립트에서 이를 활성화하려면 쉘 옵션을 설정하십시오.외부 전역 변수...

우리가 말하면$디렉토리==/home/me/////////stuff//items

shopt -s extglob; dir="${dir//+(\/)//}"

결과 값$디렉토리

/home/me/stuff/items  

다음은 해야 할 일과 하지 말아야 할 일의 몇 가지 예입니다.Bash 확장 와일드카드

관련 정보