比如说我有一条类似的路径
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 命令dirname
和basename
。
答案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