我有一个脚本需要一个目录作为一个参数。我想支持两种形式:一种是像
a/b/c
(末尾没有斜杠)另一个就像
a/b/c/
(末尾有斜线)。
我的问题:给定两种形式中的任何一种,我如何才能保持第一种形式不变并删除第二种形式的最后一个斜杠以将其转换为第一种形式。
答案1
dir=${1%/}
将采用脚本的第一个参数并删除结尾的斜杠(如果有)。
答案2
要删除尾部斜杠(如果有),可以使用后缀删除参数扩展所有 POSIX 风格 shell 中都存在的构造:
x=${x%/}
有一些并发症。这只会删除一个斜杠,所以如果你开始的a/b/c//
话,你仍然会得到一个斜杠。此外,如果原始路径是/
,则需要保留斜杠。这是处理这些情况的更复杂的解决方案:
case $x in
*[!/]*/) x=${x%"${x##*[!/]}"};;
*[/]) x="/";;
esac
或者,在 ksh 或 bash 中shopt -s extglob
:
[[ x = *[!/] ]] || x=${x%%*(/)}
请注意,在许多情况下,结尾有斜杠并不重要。如果参数是指向目录的符号链接,则很重要:带有尾部斜杠的参数指定目录,而没有尾部斜杠的参数指定符号链接本身。它对于其他一些程序也很重要,例如,rsync
根据尾随斜杠的存在,对源参数进行不同的处理。
答案3
realpath
解析给定路径。除此之外,它还删除了尾部斜杠。用于-s
防止以下 simlinks
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a