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: dada uma das duas formas, como posso manter a primeira forma inalterada e remover a última barra da segunda forma para convertê-la na primeira forma.
shell-script
filenames
string
Yulong Ao
fonte
fonte
/
.rsync
.Respostas:
pegará o primeiro parâmetro do script e removerá uma barra final, se houver.
fonte
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:
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:Como alternativa, em ksh ou no bash após
shopt -s extglob
: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.fonte
realpath
resolve o caminho especificado. Entre outras coisas, também remove barras à direita. Use-s
para evitar seguir os simlinksfonte