변수 끝에서 문자 제거


130

Bash 자동 완성은 디렉토리 이름 끝에 /를 추가합니다. 위치 매개 변수에서 어떻게 제거 할 수 있습니까?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup

답변:


242

사용하다

target=${1%/}

참조 .


8
그리고 POSIX 이므로 휴대가 편리합니다.
go2null

3
루트 (/)를 안전하게 유지하면서 여러 후행 '/'를 제거하는 간단한 방법 은 Gilles 답변 을 참조하십시오 . case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null

1
그리고 이것을 DIR과 같은 변수와 함께 사용해야한다면target=${DIR%/}
Brad Parks

링크가 죽었습니다 (우크라이나)
Зелди

@ Зелди-감사합니다.
마틴 클레이튼


13

경로를 정식화하는 더 나은 솔루션은 존재하지 않는 경우 realpath $path또는 -m옵션으로 생각 합니다. 이 솔루션은 불필요한 슬래시를 자동으로 제거하고 암호를 추가합니다


realpath는 이식성이 떨어질 것
Matthew

realpath는 실제로 리눅스 배포판에있는 GNU coreutils의 일부이며,이 경우 사용자는 이식성을
잃을

2
모든 배포판에 realpath가 포함되어있는 것은 아닙니다. 예를 들어, Linux Mint 17 (Ubuntu 기반)을 실행 중이며 기본적으로는 없습니다. 저장소에 있지만 자동으로 설치되지는 않습니다. 그것이 내가 게시 한 링크가 논의 한 내용입니다.
Matthew

정답으로 표시된 답변이 제목에 가장 적합하고 가장 일반적이지만 지정된 사용 사례에 적합한 솔루션입니다. 나를 위해 URL에서 후행 슬래시를 제거하여 이것이 작동하지 않도록하고 싶었습니다. 귀하의 제안에 관해서는, 내가 경험에서 찾은 readlink -f것은 realpath. 추가 / 대체 옵션 : linux.die.net/man/1/readlink
flungo

1
이것은 나를 위해 일했다 :target=$(realpath -L --relative-base . $1)
Mattia72

3

bash3은 perl-similar 정규식을 bash에 추가했습니다. 언급 된 가이드는 GNU 공식 가이드 뿐만 아니라이 가이드도 다루지 만 모든 참조가 아닙니다.

내가 뭘 한거지?

대체 2.19/*2.19.

해결책

VER="2.19/foo-bar"
NEWVER=${VER%/*}

작동하지 않으면 슬래시가 여전히 있습니다 (예 : 변수의 끝에는 없습니다).
Zelphir Kaltstahl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.