Eliminar un carácter del final de una variable


130

La finalización automática de Bash agrega un / al final del nombre de un directorio. ¿Cómo puedo quitar esto de un parámetro posicional?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup

Respuestas:


242

Utilizar

target=${1%/}

Una referencia .


8
Y es POSIX , por lo que es bastante portátil.
go2null

3
Ver Gilles respuesta de una manera sencilla para despojar a múltiples terminador '/' s, manteniendo la raíz (/) salvo: case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null

1
y si tuvieras que usar esto con una variable, por ejemplo DIR, entonces seríatarget=${DIR%/}
Brad Parks el

Un enlace está muerto (Ucrania)
Зелди

@ Зелди - gracias, arreglado.
Martin Clayton


13

Creo que la mejor solución para canonizar rutas es realpath $patho con -mopción si no existe. Esta solución elimina automáticamente las barras innecesarias y agrega pwd


no es probable que realpath sea muy portátil: unix.stackexchange.com/questions/101080/…
Matthew

realpath es parte de GNU coreutils, que es de facto en la distribución de Linux y en este caso los usuarios pueden haber instalado diferentes paquetes externos que pueden romper la portabilidad
amenzhinsky

2
No todas las distribuciones incluyen Realpath. Por ejemplo, estoy ejecutando Linux Mint 17 (que está basado en Ubuntu) y no lo tiene por defecto. Está en los repositorios, pero no se instala automáticamente. Eso es lo que el enlace que publiqué estaba discutiendo.
Mateo

Buena solución para el caso de uso especificado, aunque la respuesta marcada como correcta es la mejor para el título y la más genérica. Para mí, quería eliminar la barra diagonal final de una URL para que esto no hubiera funcionado. Con respecto a su sugerencia aquí, lo que he encontrado por experiencia es que readlink -fes un poco más portátil que realpath. Para opciones adicionales / alternativas: linux.die.net/man/1/readlink
flungo

1
Esto funcionó para mí:target=$(realpath -L --relative-base . $1)
Mattia72

3

Tenga cuidado, bash3 agregó expresiones regulares similares a perl a bash. La guía mencionada cubre esto, así como la guía oficial de GNU , pero no todas las referencias lo hacen.

Que hice

Sustituir 2.19/*a ser 2.19.

Solución

VER="2.19/foo-bar"
NEWVER=${VER%/*}

No funciona, la barra todavía está allí (al final de la variable, que su ejemplo no tiene).
Zelphir Kaltstahl el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.