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

Réponses:


242

Utilisation

target=${1%/}

Une référence .


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


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%/*}

Ne fonctionne pas, la barre oblique est toujours là (à la fin de la variable, que votre exemple n'a pas).
Zelphir Kaltstahl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.