Hapus karakter dari akhir variabel

130

Penyelesaian otomatis Bash menambahkan a / di akhir nama direktori. Bagaimana saya bisa menghapus ini dari parameter posisi?

#!/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
sumber

Jawaban:

242

Menggunakan

target=${1%/}

Sebuah referensi .

martin clayton
sumber
8
Dan itu POSIX , jadi cukup portabel.
go2null
3
Lihat jawaban Gilles untuk cara sederhana untuk menghapus beberapa trailing '/ sambil menjaga root (/) aman: case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null
1
dan jika Anda harus menggunakan ini dengan variabel, misalnya DIR, maka itu akantarget=${DIR%/}
Brad Parks
Tautan sudah mati (Ukraina)
Зелди
@ Зелди - terima kasih, sudah diperbaiki.
martin clayton
13

Saya pikir solusi yang lebih baik untuk jalur kanonisasi adalah realpath $pathatau dengan -mopsi jika tidak ada. Solusi ini secara otomatis menghilangkan garis miring yang tidak perlu dan menambahkan pwd

amenzhinsky
sumber
realpath kemungkinan tidak akan terlalu portabel: unix.stackexchange.com/questions/101080/…
Matthew
realpath adalah bagian dari GNU coreutils yang merupakan de facto dalam distribusi linux dan dalam hal ini pengguna mungkin telah menginstal paket eksternal yang berbeda yang dapat merusak portabilitas
amenzhinsky
2
Tidak semua distro termasuk realpath. Misalnya, saya menjalankan Linux Mint 17 (yang berbasis Ubuntu) dan tidak memilikinya secara default. Ada dalam repo, tetapi tidak diinstal secara otomatis. Itulah yang dibahas oleh tautan yang saya posting.
Matius
Solusi yang bagus untuk kasus penggunaan yang ditentukan meskipun jawaban yang ditandai benar adalah yang terbaik untuk judul dan paling umum. Bagi saya, saya ingin menghapus garis miring dari URL sehingga ini tidak akan berhasil. Mengenai saran Anda di sini, apa yang saya temukan dari pengalaman adalah yang readlink -fsedikit lebih portabel daripada realpath. Untuk opsi tambahan / alternatif: linux.die.net/man/1/readlink
flungo
1
Ini bekerja untuk saya:target=$(realpath -L --relative-base . $1)
Mattia72
3

Hati-hati, bash3 menambahkan perl-mirip regex ke bash. Panduan yang disebutkan mencakup ini juga sebagai panduan resmi di GNU , tetapi tidak semua referensi melakukannya.

Apa yang saya lakukan?

Pengganti 2.19/*menjadi 2.19.

Larutan

VER="2.19/foo-bar"
NEWVER=${VER%/*}
John P. Fisher
sumber
Tidak berfungsi, slash masih ada (di akhir variabel, yang contoh Anda tidak punya).
Zelphir Kaltstahl