como remover a última barra do caminho do diretório?

12

Eu tenho um script que requer um diretório como um argumento. Eu quero apoiar as duas formas: uma é como

a/b/c

(sem barra no final) e outra é como

 a/b/c/

(tem barra no final).

Minha pergunta: dado qualquer um dos dois formulários, como posso manter o primeiro formulário inalterado e remover a última barra do segundo formulário para convertê-lo no primeiro formulário.

    
por Yulong Ao 23.04.2015 / 03:23

3 respostas

16
dir=${1%/}

terá o primeiro parâmetro do script e removerá uma barra final se houver uma.

    
por 23.04.2015 / 03:29
6

Para remover uma barra à direita, se houver, você pode usar a remoção do sufixo expansão de parâmetro presente em todos os shells ao estilo POSIX:

x=${x%/}

Existem algumas complicações. Isso remove apenas uma barra simples, portanto, se você começou com a/b/c// , ainda terá uma barra. Além disso, se o caminho original for / , você precisará manter a barra. Aqui está uma solução mais complexa que cuida desses casos:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Como alternativa, em ksh ou em bash after shopt -s extglob :

[[ x = *[!/] ]] || x=${x%%*(/)}

Observe que, em muitos casos, não importa que haja uma barra final. Não importa se o argumento é um link simbólico para um diretório: com uma barra à direita, o argumento designa o diretório, enquanto que, sem barra, o argumento designa o próprio link simbólico. Também é importante com alguns outros programas, por exemplo, o argumento de origem de rsync é tratado de forma diferente, dependendo da presença de uma barra final.

    
por 24.04.2015 / 07:06
1

realpath resolve o caminho fornecido. Entre outras coisas, também remove as barras finais. Use -s para evitar seguir os simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
    
por 07.07.2017 / 16:55