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
Burntime
fuente

Respuestas:

242

Utilizar

target=${1%/}

Una referencia .

Martin Clayton
fuente
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

amenzhinsky
fuente
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%/*}
John P. Fisher
fuente
No funciona, la barra todavía está allí (al final de la variable, que su ejemplo no tiene).
Zelphir Kaltstahl el