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.