Подтвердить что ты не робот

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

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

rsync -a --exclude='*~' "[email protected]" "$dir"

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

4b9b3361

Ответ 1

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

#!/bin/bash

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

echo ${@%/}

Ответ 2

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

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

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

Ответ 3

Принятый ответ обрезает ОДИН конец слэш.

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

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

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

echo $VALUE $TRIMMED

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

/looks/like/a/path/// /looks/like/a/path

Ответ 4

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

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

echo "${DIRECTORY:a}"

=> /some/path/name

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

Ответ 5

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

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

Ответ 6

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

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

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