Tengo un script que requiere un directorio como un argumento. Quiero apoyar las dos formas: una es como
a/b/c
(sin barra al final) y otro es como
a/b/c/
(tiene una barra al final).
Mi pregunta: dada cualquiera de las dos formas, ¿cómo puedo mantener la primera forma sin cambios y quitar la última barra diagonal de la segunda forma para convertirla en la primera forma?
shell-script
filenames
string
Yulong Ao
fuente
fuente
/
.rsync
.Respuestas:
tomará el primer parámetro de la secuencia de comandos y eliminará una barra inclinada final si hay una.
fuente
Para eliminar una barra inclinada final si hay una, puede usar la construcción de expansión del parámetro de eliminación de sufijo presente en todos los shells de estilo POSIX:
Hay algunas complicaciones. Esto solo elimina una barra oblicua, así que si comenzaste
a/b/c//
, terminarás con una barra oblicua. Además, si la ruta original era/
, debe mantener la barra diagonal. Aquí hay una solución más compleja que se ocupa de estos casos:Alternativamente, en ksh o en bash after
shopt -s extglob
:Tenga en cuenta que en muchos casos, no importa que haya una barra inclinada final. Importa si el argumento es un enlace simbólico a un directorio: con una barra inclinada final, el argumento designa el directorio, mientras que sin una barra inclinada final, el argumento designa el enlace simbólico mismo. También es importante con algunos otros programas, por ejemplo, el argumento de origen
rsync
se trata de manera diferente dependiendo de la presencia de una barra inclinada final.fuente
realpath
resuelve el camino dado. Entre otras cosas, también elimina las barras diagonales finales. Se usa-s
para evitar los siguientes enlaces sim.fuente