내가 비슷한 경로를 가지고 있다고 가정 해 봅시다
path_1=/this/is/a/path/with/slash/
다음 정보를 얻으려면 어떻게 해야 합니까?
/this/is/a/path/with/slash
따라서 경로에는 마지막 "/"가 없습니다.
답변1
모든 POSIX 쉘에는 man bash
"매개변수 확장: 일치하는 접미사 패턴 제거"가 있습니다(참고자료 참조). 그래서, 사용
$ echo "${path_1%/}"
/this/is/a/path/with/slash
변수의 값이 다음과 같은 경우아니요슬래시로 끝나면 값이 변경되지 않고 출력됩니다.
답변2
당신은 그것을 사용할 수 있습니다realpath
DIR=/tmp/foo///
echo "$(realpath -s "$DIR")"
# output: /tmp/foo
답변3
슬래시를 제거하는 또 다른 방법은 다음과 같습니다.
$ echo "$(dirname -- "$path")/$(basename -- "$path")"
우리는 두 개의 일반적인 쉘 명령 dirname
과 basename
.
답변4
몇 가지 옵션이 있습니다. 나는 보통 경로를 정규화합니다. 경로를 정규화하면 기본 경로를 얻게 됩니다.
예를 들어 경로가 폴더에 대한 링크인 경우 표준 형식은 실제 경로를 가져옵니다. 또한 Unix와 Linux에서는 일반적이지 않지만 허용되는 모든 이중 슬래시를 제거합니다.
~/lf
예 링크라고 가정합니다 ~/.hidden/food/limes/
.
PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"
결과는 다음과 같습니다/home/kamil/.hidden/food/limes/price
이는 파일, 블록 장치 등에 적용되지만 물론 뒤에 슬래시가 없습니다. 예를 들어 내 시스템에서는 다음과 같습니다.
PATHNAME=/dev/disk/by-partlabel/Boot
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"
밝혀지다/dev/nvme0n1p2
경로가 있는지 확실하지 않은 경우 몇 가지 오류 검사를 추가해야 합니다.
PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" 2>/dev/null )"
if [[ -z ${CANONICAL_PATH} ]]
then
echo "Path doesn't exist: ${PATHNAME}" >&2
else
echo "Canonical path is ${CANONICAL_PATH}"
fi