Shell-Script
如何去除目錄路徑的最後一個斜杠?
我有一個腳本,它需要一個目錄作為一個參數。我要支持兩種形式:一種是like
a/b/c
(最後沒有斜線)另一個就像
a/b/c/
(末尾有斜線)。
我的問題:給定這兩種形式中的任何一種,我怎樣才能保持第一種形式不變並去掉第二種形式的最後一個斜線以將其轉換為第一種形式。
dir=${1%/}
將採用腳本的第一個參數並刪除尾部斜杠(如果有的話)。
要刪除尾部斜杠(如果有),您可以使用所有 POSIX 樣式 shell 中存在的後綴刪除參數擴展構造:
x=${x%/}
有一些並發症。這只會刪除一個斜線,所以如果你開始了,
a/b/c//
那麼你仍然會得到一個斜線。此外,如果原始路徑是/
,則需要保留斜線。這是處理這些情況的更複雜的解決方案:case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; *[/]) x="/";; esac
或者,在 ksh 或 bash 之後
shopt -s extglob
:[[ x = *[!/] ]] || x=${x%%*(/)}
請注意,在許多情況下,是否有斜線並不重要。如果參數是指向目錄的符號連結,這很重要:帶有尾部斜杠的參數指定目錄,而沒有尾部斜杠,參數指定符號連結本身。它對其他一些程序也很重要,例如,
rsync
根據尾部斜杠的存在,源參數的處理方式不同。