Видаліть символ із кінця змінної


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

3
Дивіться відповідь Жиля про простий спосіб зняти декілька трейлінг '/', зберігаючи root (/): case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null

1
і якби вам довелося використовувати це зі змінною, наприклад, DIR, то це було бtarget=${DIR%/}
Brad Parks

Посилання мертве (Україна)
Зелді

@ Зелді - спасибі, виправлено.
martin clayton


13

Я думаю, що кращим рішенням для канонізації шляхів є realpath $pathабо -mваріант, якщо його не існує. Це рішення автоматично вилучає зайві косої риси та додає pwd


realpath, швидше за все, не дуже портативний: unix.stackexchange.com/questions/101080/…
Метью

realpath є частиною GNU coreutils, яка фактично є в Linux-дистрибутиві, і в цьому випадку користувачі можуть встановити різні зовнішні пакети, які можуть порушити портативність
amenzhinsky

2
Не кожен дистрибутив включає в себе реальний шлях. Наприклад, я запускаю 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. Згаданий путівник охоплює це, а також офіційний путівник GNU , але не всі посилання є.

Що я зробив?

Замінник 2.19/*бути2.19 .

Рішення

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

Не працює, слэш все ще є (наприкінці змінної, якої у вашому прикладі немає).
Зельфір Кальтшталь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.