Para remover uma barra final, se houver, você pode usar a construção de expansão do parâmetro de remoção de sufixo presente em todas as shells no estilo POSIX:
x=${x%/}
Existem algumas complicações. Isso remove apenas uma barra, portanto, se você começou com a/b/c//
, ainda terá uma barra. Além disso, se o caminho original era /
, você precisa 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 no bash após shopt -s extglob
:
[[ x = *[!/] ]] || x=${x%%*(/)}
Observe que, em muitos casos, não importa se há uma barra final. Não importa se o argumento é um link simbólico para um diretório: com uma barra final, o argumento designa o diretório, enquanto que sem barra final, o argumento designa o próprio link simbólico. Isso também é importante em alguns outros programas, por exemplo, o argumento de origem rsync
é tratado de maneira diferente, dependendo da presença de uma barra final.
/
.