Удалить символ из конца переменной


130

Автозавершение Bash добавляет / в конце имени каталога. Как я могу убрать это из позиционного параметра?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup

Ответы:


242

использование

target=${1%/}

Ссылка .


8
И это POSIX , поэтому он в значительной степени портативен.
— go2null 09

3
См. Ответ Жиля, где описан простой способ удалить несколько завершающих символов '/ при сохранении безопасности root (/): case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
— go2null

1
и если бы вам пришлось использовать это с переменной, например, DIR, то это было быtarget=${DIR%/}
— Брэд Паркс

Ссылка мертва (Украина)
— Зелди 06

@ Зелди - спасибо, исправлено.
— Мартин Клейтон,


13

Я думаю, что лучшее решение для канонизации путей - это realpath $pathили с -mопцией, если она не существует. Это решение автоматически удаляет ненужные косые черты и добавляет pwd


realpath вряд ли будет очень портативным: unix.stackexchange.com/questions/101080/…
— Мэтью

realpath является частью GNU coreutils, которая де-факто входит в дистрибутив Linux, и в этом случае пользователи могли установить разные внешние пакеты, которые могут нарушить переносимость
— Аменжинский

2
Не каждый дистрибутив включает realpath. Например, я использую Linux Mint 17 (который основан на Ubuntu), и по умолчанию он не установлен. Он есть в репозиториях, но не устанавливается автоматически. Это то, что я опубликовал по ссылке.
— Мэтью

Хорошее решение для указанного варианта использования, хотя ответ, помеченный как правильный, является лучшим для заголовка и наиболее общим. Для меня я хотел удалить косую черту в конце URL-адреса, чтобы это не сработало. Что касается вашего предложения здесь, то, что я обнаружил по опыту, readlink -fэто немного более портативно, чем realpath. Для дополнительных / альтернативных опций: linux.die.net/man/1/readlink
— flungo

1
Это сработало для меня:target=$(realpath -L --relative-base . $1)
— Mattia72

3

Будьте осторожны, bash3 добавил в bash регулярное выражение, похожее на Perl. Упомянутое руководство охватывает это, а также официальное руководство GNU , но не все ссылки.

Что я сделал?

Заменить 2.19/*быть2.19 .

Решение

VER="2.19/foo-bar"
NEWVER=${VER%/*}

Не работает, косая черта все еще присутствует (в конце переменной, которой в вашем примере нет).
— Zelphir Kaltstahl 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.