두 문자열을 연결하여 전체 경로를 만드는 방법
저는 bash 스크립트를 작성하려고 합니다.이 스크립트에서 사용자가 디렉토리의 경로를 입력하도록 합니다.그런 다음 이 문자열 끝에 일부 문자열을 추가하고 일부 하위 디렉터리에 대한 경로를 구성합니다.예를 들어 사용자가 다음과 같은 문자열을 입력한다고 가정합니다.
/home/user1/MyFolder
이제 이 디렉터리에 2개의 하위 디렉터리를 만들고 일부 파일을 복사합니다.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
어떻게 해야 하나요?
은 복수의 POSIX를 ./
의 글로취됨으로 /
파일명으로따라서//dir///subdir////file
는 와동합다니와 ./dir/subdir/file
.
따라서 두 문자열을 연결하여 전체 경로를 구축하는 것은 다음과 같이 간단합니다.
full_path="$part1/$part2"
#!/bin/bash
read -p "Enter a directory: " BASEPATH
SUBFOLD1=${BASEPATH%%/}/subFold1
SUBFOLD2=${BASEPATH%%/}/subFold2
echo "I will create $SUBFOLD1 and $SUBFOLD2"
# mkdir -p $SUBFOLD1
# mkdir -p $SUBFOLD2
그리고 만약 당신이 완성을 얻기 위해 리드라인을 사용하고 싶다면, 그리고 그 모든 것을 추가하세요.-e
하기 위해서.read
:
read -e -p "Enter a directory: " BASEPATH
단순히 경로의 일부를 연결하면 원하는 것을 달성할 수 있지 않을까요?
$ base="/home/user1/MyFolder/"
$ subdir="subFold1"
$ new_path=$base$subdir
$ echo $new_path
/home/user1/MyFolder/subFold1
그런 다음 필요에 따라 폴더/디렉토리를 생성할 수 있습니다.
를 한가관디경다것종입다로 것입니다./
(예:)/home/
/로 시작하는 경로가 루트 디렉터리와 혼동될 수 있기 때문입니다.이중 슬래시인 경우(//
정확합니다.)는 경로에서 사용되며, 여전히 정확합니다.(예 그나두변모예슬사않잘지못것된입니다면으되용가시래에두수러예(것▁but:입▁is다,니된:/home/user1/MyFoldersubFold1
).
다음 스크립트는 여러 (상대/절대) 경로(BASEPATH)를 상대 경로(SUBDIR)로 분류합니다.
shopt -s extglob
SUBDIR="subdir"
for BASEPATH in '' / base base/ base// /base /base/ /base//; do
echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR"
done
출력은 다음과 같습니다.
BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base/subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base/subdir
그shopt -s extglob
BASEPATH를 여러 슬래시로 종료할 경우에만 필요합니다(이는 아마도 넌센스일 것입니다).확장 글로빙 없이 다음을 사용할 수 있습니다.
echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR
이는 덜 깔끔하지만 여전히 작동하는 결과를 초래할 것입니다.
BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base//subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base//subdir
저는 제 셸 스크립트로 작업을 하고 있었습니다. 여러분과 같은 경로로 작업을 해야 합니다.
중요한 것은, 두 경로가
/data/foo/bar
/data/foo/bar/
유효합니다.
이 경로에 다음과 같은 파일을 추가하려면
/data/foo/bar/myfile
이러한 상황을 처리할 수 있는 네이티브 메소드(python의 os.path.sys와 같은)가 셸에 없었습니다.
하지만 저는 속임수를 찾았습니다.
예를 들어, 기본 경로가 셸 변수에 저장되었습니다.
BASE=~/mydir
가입하고 싶은 마지막 파일 이름은
FILE=myfile
그러면 다음과 같이 새 경로를 할당할 수 있습니다.
NEW_PATH=$(realpath ${BASE})/FILE
그러면 당신은 얻을 것입니다.
$ echo $NEW_PATH
/path/to/your/home/mydir/myfile
그 이유는 매우 간단합니다. "realpath" 명령은 필요한 경우 항상 종료 슬래시를 트리밍합니다.
빈 dir (두 번째 문자열이 "dir"로해야 할 .)/
다음 중 어느 것을 절대 경로로 취급해야 합니까?:
#!/bin/bash
join_path() {
echo "${1:+$1/}$2" | sed 's#//#/#g'
}
join_path "" a.bin
join_path "/data" a.bin
join_path "/data/" a.bin
출력:
a.bin
/data/a.bin
/data/a.bin
참조:셸 매개 변수 확장
모든 $*
인수()를 구분 기호로 '/'(IFS=/
- 내부 필드 구분 기호)와 병합한 다음 반복되는 '/'()를 모두 제거했습니다.tr -s /
).
내 기능은 다음과 같습니다.
join_paths() {
(IFS=/; echo "'$*'" | tr -s /)
}
@Dunes의 기본 솔루션이지만 빈 문자열을 설명합니다.
[ -z "$rootpath" ] && rootpath="."
fullpath="${rootpath}/${subdir}"
언급URL : https://stackoverflow.com/questions/11226322/how-to-concatenate-two-strings-to-build-a-complete-path
'programing' 카테고리의 다른 글
psql: 치명적:사용자 "postgres"에 대한 ID 인증 실패 (0) | 2023.06.01 |
---|---|
presentViewController 및 탐색 모음 표시 (0) | 2023.06.01 |
엑셀에서 셀을 KB, MB, GB 등으로 포맷하려면 어떻게 해야 합니까? (0) | 2023.06.01 |
삽입 시간별로 유성 컬렉션을 정렬하려면 어떻게 해야 합니까? (0) | 2023.06.01 |
iOS 7에서 사용되지 않는 크기(WithFont:straintedToSize:lineBreakMode:)를 대체하시겠습니까? (0) | 2023.06.01 |