Saya memiliki skrip yang memerlukan direktori sebagai satu argumen. Saya ingin mendukung dua bentuk: satu seperti
a/b/c
(tidak ada garis miring di akhir) dan yang lainnya seperti
a/b/c/
(memiliki garis miring pada bagian akhir).
Pertanyaan saya: diberikan salah satu dari dua bentuk, bagaimana saya bisa menjaga bentuk pertama tidak berubah dan menghapus garis miring terakhir dari bentuk kedua untuk mengubahnya menjadi bentuk pertama.
shell-script
filenames
string
Yulong Ao
sumber
sumber
/
.rsync
.Jawaban:
akan mengambil parameter pertama skrip dan menghapus garis miring jika ada.
sumber
Untuk menghapus trailing slash jika ada, Anda dapat menggunakan konstruksi ekspansi parameter suffix yang ada di semua shell gaya POSIX:
Ada beberapa komplikasi. Ini hanya menghapus satu tebasan, jadi jika Anda memulai dengan
a/b/c//
maka Anda masih akan berakhir dengan tebasan. Selanjutnya, jika jalur aslinya adalah/
, Anda harus menjaga garis miring. Berikut ini solusi yang lebih kompleks yang menangani kasus-kasus ini:Atau, dalam ksh, atau dalam bash setelah
shopt -s extglob
:Perhatikan bahwa dalam banyak kasus, tidak masalah ada garis miring. Tidak masalah jika argumennya adalah tautan simbolik ke direktori: dengan garis miring, argumen menunjuk direktori, sedangkan tanpa garis miring, argumen menunjuk tautan simbolik itu sendiri. Ini juga penting dengan beberapa program lain, misalnya argumen sumber
rsync
diperlakukan berbeda tergantung pada adanya garis miring.sumber
realpath
menyelesaikan jalur yang diberikan. Antara lain itu juga menghilangkan garis miring. Gunakan-s
untuk mencegah simlink berikutsumber