web-dev-qa-db-fra.com

Quelle est la façon la plus simple de supprimer une barre oblique de fin de chaque paramètre?

Quelle est la façon la plus simple de supprimer une barre oblique de fin de chaque paramètre du tableau '$ @', afin que rsync copie les répertoires par nom?

rsync -a --exclude='*~' "$@" "$dir"

Le titre a été modifié pour plus de clarté. Pour comprendre les commentaires et répondre à propos de plusieurs barres obliques de fin, consultez l'historique des modifications.

66
sid_com

Vous pouvez utiliser le ${parameter%Word} extension détaillée ici . Voici un script de test simple qui illustre le comportement:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}
117
Sean Bright

La réponse acceptée supprimera UNE barre oblique de fin.

Une façon de supprimer plusieurs barres obliques de fin est la suivante:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

Quelles sorties:

/looks/like/a/path/// /looks/like/a/path
21
Chris Johnson

Cela fonctionne pour moi: ${VAR%%+(/)}

Comme décrit ici http://wiki.bash-hackers.org/syntax/pattern

Il peut être nécessaire de définir l'option shell extglob. Je ne peux pas le voir activé pour moi, mais cela fonctionne toujours

17
Ivan

realpath résout un chemin donné. Entre autres choses, il supprime également les barres obliques de fin. Utilisation -s pour éviter de suivre les liens sim

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

Dans zsh vous pouvez utiliser le :a modificateur.

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

Cela agit comme realpath mais n'échoue pas avec les fichiers/répertoires manquants comme argument.

4
Nicolai Fröhlich

Pour info, j'ai ajouté ces deux fonctions à mon .bash_profile basé sur les réponses trouvées sur SO. Comme l'a dit Chris Johnson, toutes les réponses utilisant ${x%/} supprimer une seule barre oblique, ces fonctions feront ce qu'elles disent, espérons que cela sera utile.

rem_trailing_slash() {
    echo $1 | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo $(rem_trailing_slash $1)/
}
1
Sheljohn