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

Jawaban:


242

Menggunakan

target=${1%/}

Sebuah referensi .


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


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%/*}

Tidak berfungsi, slash masih ada (di akhir variabel, yang contoh Anda tidak punya).
Zelphir Kaltstahl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.