매개변수로 디렉터리가 필요한 스크립트가 있습니다. 두 가지 형식을 지원하고 싶습니다. 하나는 다음과 같습니다.
a/b/c
(끝에 슬래시 없음) 다른 하나는 다음과 같습니다.
a/b/c/
(끝에 슬래시).
내 질문: 두 가지 양식 중 하나가 주어지면 첫 번째 양식을 변경하지 않고 유지하고 두 번째 양식에서 마지막 슬래시를 제거하여 첫 번째 양식으로 변환하려면 어떻게 해야 합니까?
답변1
dir=${1%/}
스크립트의 첫 번째 인수를 취하고 후행 슬래시(있는 경우)를 제거합니다.
답변2
후행 슬래시(있는 경우)를 제거하려면 접미사 제거를 사용할 수 있습니다.매개변수 확장모든 POSIX 스타일 셸에 존재하는 구문:
x=${x%/}
몇 가지 합병증이 있습니다. 이렇게 하면 슬래시만 제거되므로 a/b/c//
로 시작하면 슬래시가 계속 표시됩니다. 또한 원래 경로가 이면 /
슬래시를 유지해야 합니다. 이러한 상황을 처리하기 위한 보다 복잡한 솔루션은 다음과 같습니다.
case $x in
*[!/]*/) x=${x%"${x##*[!/]}"};;
*[/]) x="/";;
esac
또는 ksh 또는 bash에서 shopt -s extglob
:
[[ x = *[!/] ]] || x=${x%%*(/)}
대부분의 경우 후행 슬래시는 중요하지 않습니다. 인수가 디렉터리에 대한 기호 링크인 경우 중요합니다. 후행 슬래시가 있는 인수는 디렉터리를 지정하고, 후행 슬래시가 없는 인수는 기호 링크 자체를 지정합니다. rsync
이는 후행 슬래시의 존재 여부에 따라 소스 매개변수를 다르게 처리하는 등 일부 다른 프로그램에서도 중요합니다 .
답변3
realpath
주어진 경로를 해결합니다. 무엇보다도 후행 슬래시를 제거합니다. -s
다음 Simlink를 방지하는 데 사용됩니다 .
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a