在 bash shell 中如何删除路径的最后一个“/”?

在 bash shell 中如何删除路径的最后一个“/”?

比如说我有一条类似的路径

path_1=/this/is/a/path/with/slash/

我如何获得以下信息:

/this/is/a/path/with/slash

所以路径没有最后一个“/”

答案1

所有 POSIX shell 都有(参见man bash)“参数扩展:删除匹配的后缀模式”。所以,使用

$ echo "${path_1%/}"
/this/is/a/path/with/slash

如果变量的值是不是以斜杠结尾,则该值将不加修改地输出。

答案2

您可以使用realpath

DIR=/tmp/foo///
echo "$(realpath -s "$DIR")"
# output: /tmp/foo

答案3

删除斜杠的另一种方法是

 $ echo "$(dirname -- "$path")/$(basename -- "$path")"

我们只是组合了两个常见的 shell 命令dirnamebasename

答案4

有几种选择。我通常将路径规范化。当您规范化路径时,您将获得基本路径。

例如,如果路径是文件夹的链接,则规范形式将获取实际路径。它还将删除所有双斜杠,虽然不常见,但在 Unix 和 Linux 中是允许的。

假设~/lf是 的链接~/.hidden/food/limes/

PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"

结果将是/home/kamil/.hidden/food/limes/price

这也适用于文件、块设备等,尽管它们当然没有尾部斜杠。例如,在我的系统上:

PATHNAME=/dev/disk/by-partlabel/Boot
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"

结果是/dev/nvme0n1p2

如果您不确定该路径是否存在,则需要添加一些错误检查。

PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" 2>/dev/null )"
if [[ -z ${CANONICAL_PATH} ]]
then
    echo "Path doesn't exist: ${PATHNAME}" >&2
else
   echo "Canonical path is ${CANONICAL_PATH}"
fi

相关内容