Supprimer un caractère à la fin d'une variable

130

La complétion automatique de Bash ajoute un / à la fin d'un nom de répertoire. Comment puis-je supprimer cela d'un paramètre de position?

#!/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
la source

Réponses:

242

Utilisation

target=${1%/}

Une référence .

Martin Clayton
la source
8
Et c'est POSIX , donc à peu près portable.
go2null
3
Voir la réponse de Gilles pour un moyen simple de supprimer plusieurs '/' de fin tout en gardant root (/) en sécurité: case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null
1
et si vous deviez l'utiliser avec une variable, par exemple DIR, alors ce seraittarget=${DIR%/}
Brad Parks
Un lien est mort (Ukraine)
Зелди
@ Зелди - merci, corrigé.
martin clayton
13

Je pense qu'une meilleure solution pour canoniser les chemins est realpath $pathou avec -moption si elle n'existe pas. Cette solution supprime automatiquement les barres obliques inutiles et ajoute pwd

amenzhinsky
la source
realpath n'est probablement pas très portable: unix.stackexchange.com/questions/101080/…
Matthieu
realpath fait partie de GNU coreutils qui est de facto dans la distribution Linux et dans ce cas, les utilisateurs peuvent avoir installé différents packages externes qui peuvent briser la portabilité
amenzhinsky
2
Toutes les distributions n'incluent pas realpath. Par exemple, j'utilise Linux Mint 17 (qui est basé sur Ubuntu) et il ne l'a pas par défaut. C'est dans les dépôts, mais il n'est pas installé automatiquement. C'est ce dont parlait le lien que j'ai posté.
Matthew
Bonne solution pour le cas d'utilisation spécifié, bien que la réponse marquée comme correcte soit la meilleure pour le titre et la plus générique. Pour moi, je voulais supprimer la barre oblique de fin d'une URL pour que cela ne fonctionne pas. En ce qui concerne votre suggestion ici, ce que j'ai trouvé par expérience, c'est que readlink -fc'est un peu plus portable que realpath. Pour des options supplémentaires / alternatives: linux.die.net/man/1/readlink
flungo
1
Cela a fonctionné pour moi:target=$(realpath -L --relative-base . $1)
Mattia72
3

Attention, bash3 a ajouté une expression régulière similaire à Perl à bash. Le guide mentionné couvre cela ainsi que le guide officiel de GNU , mais toutes les références ne le font pas.

Qu'est-ce que j'ai fait?

Remplaçant 2.19/*pour être2.19 .

Solution

VER="2.19/foo-bar"
NEWVER=${VER%/*}
John P. Fisher
la source
Ne fonctionne pas, la barre oblique est toujours là (à la fin de la variable, que votre exemple n'a pas).
Zelphir Kaltstahl