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

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
Burntime
источник

Ответы:

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

amenzhinsky
источник
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