Xóa một ký tự từ cuối biến


130

Bash hoàn thành tự động nối thêm một / ở cuối tên thư mục. Làm thế nào tôi có thể loại bỏ điều này từ một tham số vị trí?

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

Câu trả lời:


242

Sử dụng

target=${1%/}

Một tài liệu tham khảo .


8
Và nó là POSIX , vì vậy là khá nhiều di động.
go2null

3
Xem câu trả lời của Gilles để biết cách đơn giản để loại bỏ nhiều dấu vết '/' trong khi giữ an toàn cho root (/): case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null

1
và nếu bạn phải sử dụng điều này với một biến, ví dụ như TRỰC TIẾP, thì đó làtarget=${DIR%/}
Brad park

Một liên kết là chết (Ukraine)
Зелди

@ Елди - cảm ơn, đã sửa.
martin clayton


13

Tôi nghĩ giải pháp tốt hơn để chuẩn hóa đường dẫn là realpath $pathhoặc với -mtùy chọn nếu nó không tồn tại. Giải pháp này tự động loại bỏ các dấu gạch chéo không cần thiết và thêm pwd


realpath không có khả năng rất di động: unix.stackexchange.com/questions/101080/ Khăn
Matthew

realpath là một phần của GNU coreutils, thực tế trong phân phối linux và trong trường hợp này, người dùng có thể đã cài đặt các gói bên ngoài khác nhau có thể phá vỡ tính di động
amenzhinsky

2
Không phải mọi distro đều bao gồm realpath. Chẳng hạn, tôi đang chạy Linux Mint 17 (dựa trên Ubuntu) và mặc định nó không có nó. Nó ở trong repos, nhưng nó không được cài đặt tự động. Đó là những gì liên kết tôi đã đăng đang thảo luận.
Matthew

Giải pháp tốt cho trường hợp sử dụng được chỉ định mặc dù câu trả lời được đánh dấu là chính xác là tốt nhất cho tiêu đề và chung chung nhất. Đối với tôi, tôi muốn xóa dấu gạch chéo khỏi URL để điều này không hoạt động. Liên quan đến đề xuất của bạn ở đây, những gì tôi đã tìm thấy từ kinh nghiệm là nó readlink -fdễ mang theo hơn một chút realpath. Đối với các tùy chọn bổ sung / thay thế: linux.die.net/man/1/readlink
flungo

1
Điều này làm việc cho tôi:target=$(realpath -L --relative-base . $1)
Mattia72

3

Hãy cẩn thận, bash3 thêm regex tương tự perl vào bash. Hướng dẫn được đề cập bao gồm điều này cũng như hướng dẫn chính thức tại GNU , nhưng không phải tất cả các tài liệu tham khảo đều làm.

Tôi đã làm gì?

Thay thế 2.19/*để được 2.19.

Giải pháp

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

Không hoạt động, dấu gạch chéo vẫn còn đó (ở cuối biến, ví dụ của bạn không có).
Zelphir Kaltstahl
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.