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


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.