dir=${1%/}
terá o primeiro parâmetro do script e removerá uma barra final se houver uma.
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.
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.
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
Tags shell-script filenames string