Какой самый простой способ удалить косую черту из каждого параметра? - PullRequest
66 голосов
/ 26 января 2012

Какой самый простой способ удалить косую черту из каждого параметра в массиве '$ @', чтобы rsync копировал каталоги по имени?

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

Название было изменено для уточнения.Чтобы понять комментарии и ответы о множественных конечных слешах, см. Историю изменений.

Ответы [ 6 ]

115 голосов
/ 26 января 2012

Вы можете использовать расширение ${parameter%word}, которое подробно здесь . Вот простой тестовый скрипт, демонстрирующий поведение:

#!/bin/bash

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

echo ${@%/}
21 голосов
/ 29 сентября 2015

Принятый ответ обрежет ОДИН трейлинг-слэш.

Один из способов обрезать несколько слэшей-слэшей выглядит следующим образом:

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

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

echo $VALUE $TRIMMED

Какие выходные данные:

/looks/like/a/path/// /looks/like/a/path
17 голосов
/ 08 января 2015

Это работает для меня: ${VAR%%+(/)}

Как описано здесь http://wiki.bash -hackers.org / syntax / pattern

Может потребоваться установить параметр оболочкиextglob.Я не вижу его включенным для меня, но он все еще работает

5 голосов
/ 07 июля 2017

realpath разрешает данный путь.Среди прочего он также удаляет косые черты.Используйте -s для предотвращения следующих симлинков

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
4 голосов
/ 28 октября 2015

В zsh вы можете использовать модификатор :a.

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

echo "${DIRECTORY:a}"

=> /some/path/name

Это действует как realpath, но не приводит к отсутствию файлов / каталогов в качестве аргумента.

1 голос
/ 16 августа 2016

К вашему сведению, я добавил эти две функции к своему .bash_profile на основе ответов, найденных в SO.Как сказал Крис Джонсон, все ответы, использующие ${x%/}, удаляют только одну косую черту, эти функции будут делать то, что говорят, надеюсь, это полезно.

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

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