如何去除目录路径的最后斜杠?


17

我有一个脚本,它需要一个目录作为一个参数。我想支持两种形式:一种是

a/b/c

(最后没有斜杠),另一个就像

 a/b/c/

(末尾有斜线)。

我的问题:给定两种形式中的任一种,我如何才能保持第一种形式不变并去除第二种形式的最后一个斜杠以将其转换为第一种形式。


2
并不是说这应该是一个大问题-在开始处以外的任何地方都使用双斜杠等效于一个斜杠,因此不必担心使用来加入它们/
muru 2015年

@muru我以前不知道这个:)。
Yulong Ao


1
@muru末尾的斜杠可能会有所不同,例如,作用于符号链接和作用于指向的目录之间的区别,或者是的源参数rsync
吉尔斯(Gilles)'所以

@Gilles确实如此,但是如您所见,我正在谈论加入路径。
muru 2015年

Answers:



12

要删除后跟的斜杠(如果有的话),可以使用所有POSIX样式的shell中都存在的后缀删除参数扩展结构:

x=${x%/}

有一些并发症。这只会删除一个斜杠,因此,如果您以开始,a/b/c//那么您仍然会以斜杠结尾。此外,如果原始路径为/,则需要保留斜线。这是解决这些情况的更复杂的解决方案:

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

或者,在ksh或bash之后shopt -s extglob

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

请注意,在许多情况下,斜杠没关系。参数是否是指向目录的符号链接确实很重要:带有斜杠的参数指定目录,而没有斜杠的参数指定符号链接本身。其他一些程序也很重要,例如,rsync取决于尾部斜杠的存在,对source参数的区别对待。


2

realpath解析给定的路径。除其他外,它还删除了斜杠。使用-s防止以下simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.