Làm thế nào để tước dấu gạch chéo cuối cùng của đường dẫn thư mục?


16

Tôi có một kịch bản yêu cầu một thư mục là một đối số. Tôi muốn hỗ trợ hai hình thức: một là như

a/b/c

(không có dấu gạch chéo ở cuối) và cái khác giống như

 a/b/c/

(có dấu gạch chéo ở cuối).

Câu hỏi của tôi: được đưa ra một trong hai hình thức, làm thế nào tôi có thể giữ hình thức đầu tiên không thay đổi và tước dấu gạch chéo cuối cùng của hình thức thứ hai để chuyển đổi nó thành hình thức đầu tiên.


2
Không phải là vấn đề lớn - một dấu gạch chéo kép ở bất cứ đâu ngoại trừ lúc bắt đầu tương đương với một dấu gạch chéo, vì vậy đừng lo lắng về việc tham gia chúng bằng cách sử dụng /.
muru

@muru Tôi không biết điều này trước đây :).
Yulong Ao

Đây là một câu hỏi hay về các phân tách đường dẫn liên tiếp
Peter.O

1
@muru Một dấu gạch chéo ở cuối có thể tạo ra sự khác biệt, chẳng hạn như sự khác biệt giữa hành động trên một liên kết tượng trưng và hành động trên thư mục mà nó trỏ đến hoặc đối số nguồn của rsync.
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles thực sự, nhưng như bạn có thể thấy, tôi đang nói về việc tham gia các con đường.
muru

Câu trả lời:


23
dir=${1%/}

sẽ lấy tham số đầu tiên của tập lệnh và xóa dấu gạch chéo nếu có.


11

Để xóa dấu gạch chéo nếu có, bạn có thể sử dụng cấu trúc mở rộng tham số loại bỏ hậu tố có trong tất cả các kiểu vỏ POSIX:

x=${x%/}

Có một vài biến chứng. Điều này chỉ loại bỏ một dấu gạch chéo, vì vậy nếu bạn bắt đầu a/b/c//với một dấu gạch chéo. Hơn nữa, nếu đường dẫn ban đầu là /, bạn cần giữ dấu gạch chéo. Đây là một giải pháp phức tạp hơn, xử lý các trường hợp này:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Ngoài ra, trong ksh hoặc trong bash sau shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Lưu ý rằng trong nhiều trường hợp, không có dấu gạch chéo. Sẽ không có vấn đề gì nếu đối số là một liên kết tượng trưng đến một thư mục: với dấu gạch chéo, đối số chỉ định thư mục, trong khi không có dấu gạch chéo, đối số chỉ định chính liên kết tượng trưng. Nó cũng có vấn đề với một vài chương trình khác, ví dụ, đối số nguồn rsyncđược xử lý khác nhau tùy thuộc vào sự hiện diện của dấu gạch chéo.


1

realpathgiải quyết con đường đã cho. Trong số những thứ khác, nó cũng loại bỏ dấu gạch chéo. Sử dụng -sđể ngăn chặn các liên kết sau

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.