comment supprimer la dernière barre oblique du chemin du répertoire?

17

J'ai un script qui nécessite un répertoire comme argument. Je veux soutenir les deux formes: l'une est comme

a/b/c

(pas de slash à la fin) et un autre est comme

 a/b/c/

(a une barre oblique à la fin).

Ma question: étant donné l'un des deux formulaires, comment puis-je simplement conserver le premier formulaire inchangé et supprimer la dernière barre oblique du deuxième formulaire pour le convertir en premier formulaire.

Yulong Ao
la source
2
Cela ne devrait pas poser beaucoup de problème - une double barre oblique n'importe où sauf au début équivaut à une seule barre oblique, alors ne vous inquiétez pas de les joindre à l'aide /.
muru
@muru Je ne le savais pas avant :).
Yulong Ao
Voici un bon Q / A sur les séparateurs de
chemins
1
@muru Une barre oblique à la fin peut faire une différence, comme la différence entre agir sur un lien symbolique et agir sur le répertoire vers lequel il pointe, ou l'argument source de rsync.
Gilles 'SO- arrête d'être méchant'
@Gilles en effet, mais comme vous pouvez le voir, je parle de rejoindre les chemins.
muru le

Réponses:

23
dir=${1%/}

prendra le premier paramètre du script et supprimera une barre oblique s'il y en a une.

glenn jackman
la source
12

Pour supprimer une barre oblique s'il y en a une, vous pouvez utiliser la construction d' expansion de paramètre de suppression de suffixe présente dans tous les shells de style POSIX:

x=${x%/}

Il y a quelques complications. Cela ne supprime qu'une seule barre oblique, donc si vous avez commencé, a/b/c//vous vous retrouverez toujours avec une barre oblique. De plus, si le chemin d'origine était /, vous devez conserver la barre oblique. Voici une solution plus complexe qui prend en charge ces cas:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Alternativement, en ksh, ou en bash après shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Notez que dans de nombreux cas, peu importe qu'il y ait une barre oblique de fin. Peu importe si l'argument est un lien symbolique vers un répertoire: avec une barre oblique de fin, l'argument désigne le répertoire, alors que sans barre oblique de fin, l'argument désigne le lien symbolique lui-même. Cela concerne également quelques autres programmes, par exemple l'argument source de rsyncest traité différemment selon la présence d'une barre oblique de fin.

Gilles 'SO- arrête d'être méchant'
la source
2

realpathrésout un chemin donné. Entre autres choses, il supprime également les barres obliques de fin. Utiliser -spour empêcher les liens SIM suivants

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
czerny
la source