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.
shell-script
filenames
string
Yulong Ao
la source
la source
/
.rsync
.Réponses:
prendra le premier paramètre du script et supprimera une barre oblique s'il y en a une.
la source
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:
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:Alternativement, en ksh, ou en bash après
shopt -s extglob
: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
rsync
est traité différemment selon la présence d'une barre oblique de fin.la source
realpath
résout un chemin donné. Entre autres choses, il supprime également les barres obliques de fin. Utiliser-s
pour empêcher les liens SIM suivantsla source