Remover um caractere do final de uma variável

130

O preenchimento automático do Bash anexa a / no final de um nome de diretório. Como posso retirar isso de um parâmetro posicional?

#!/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
Burntime
fonte

Respostas:

242

Usar

target=${1%/}

Uma referência .

Martin Clayton
fonte
8
E é POSIX , então é praticamente portátil.
Go2null
3
Veja a resposta de Gilles para uma maneira simples de remover vários '/' à direita, mantendo o root (/) seguro: case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null
1
e se você tivesse que usar isso com uma variável, por exemplo, DIR, em seguida, que seriatarget=${DIR%/}
Brad Parks
Um link está morto (Ucrânia)
quarta
@ --Елди - obrigado, fixo.
martin clayton
13

Eu acho que a melhor solução para canonizar caminhos é realpath $pathou com -mopção se ela não existir. Esta solução remove automaticamente barras desnecessárias e adiciona senhas

amenzhinsky
fonte
realpath não é susceptível de ser muito portátil: unix.stackexchange.com/questions/101080/...
Matthew
realpath é uma parte da coreutils GNU que é de facto no linux distribuição e, neste caso, os usuários podem ter instalado diferentes pacotes externos que podem quebrar a portabilidade
amenzhinsky
2
Nem toda distribuição inclui o caminho real. Por exemplo, estou executando o Linux Mint 17 (que é baseado no Ubuntu) e não o possui por padrão. Está nos repositórios, mas não é instalado automaticamente. Foi sobre isso que o link que eu postei estava discutindo.
Matthew
Boa solução para o caso de uso especificado, embora a resposta marcada como correta seja a melhor para o título e a mais genérica. Para mim, eu queria remover a barra à direita de uma URL para que isso não funcionasse. Em relação à sua sugestão aqui, o que descobri por experiência própria é que readlink -fé um pouco mais portátil do que realpath. Para opções de additonal / alternativas: linux.die.net/man/1/readlink
flungo
1
Isso funcionou para mim:target=$(realpath -L --relative-base . $1)
Mattia72 11/11
3

Cuidado, o bash3 adicionou regex semelhante ao perl ao bash. O guia mencionado cobre isso, assim como o guia oficial do GNU , mas nem todas as referências.

O que eu fiz?

Substitua 2.19/*para ser2.19 .

Solução

VER="2.19/foo-bar"
NEWVER=${VER%/*}
John P. Fisher
fonte
Não funciona, a barra ainda está lá (no final da variável, que seu exemplo não possui).
Zelphir Kaltstahl