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

Yul*_* Ao 23 string shell-script filenames

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

a/b/c
Run Code Online (Sandbox Code Playgroud)

(末尾没有斜线)另一个就像

 a/b/c/
Run Code Online (Sandbox Code Playgroud)

(末尾有斜线)。

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

gle*_*man 32

dir=${1%/}
Run Code Online (Sandbox Code Playgroud)

将采用脚本的第一个参数并删除尾部斜杠(如果有)。


Gil*_*il' 15

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

x=${x%/}
Run Code Online (Sandbox Code Playgroud)

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

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac
Run Code Online (Sandbox Code Playgroud)

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

[[ x = *[!/] ]] || x=${x%%*(/)}
Run Code Online (Sandbox Code Playgroud)

请注意,在许多情况下,尾随斜杠并不重要。参数是否是指向目录的符号链接很重要:带有斜杠的参数指定目录,而没有尾部斜杠的参数指定符号链接本身。这对于其他一些程序也很重要,例如,rsync根据尾部斜杠的存在,源参数的处理方式不同。


cze*_*rny 5

realpath解析给定路径。除此之外,它还删除了尾部斜杠。用于-s防止以下 simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Run Code Online (Sandbox Code Playgroud)