쉘 스크립트(예: 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}//\/\/##/\/}
$IFS
ksh와 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 확장 와일드카드