在 Linux 中,如何通过连接两个字符串来构建完整路径?

linuxopen sourceoperating system更新于 2026/1/27 16:52:17

概述

我们将介绍一些通过将两个路径合并为一个来创建完整 Linux 路径的方法。

我们首先来介绍一些实现此目的的基本技巧。然后,我们将讨论一种通用方法,用于处理组合路径时出现的一些特殊情况。

连接字符串构建路径

我们首先来看一个示例,其中我们需要连接字符串来创建完整的路径。

$ my_home_dir="/home/shubh/baeldung/"

这里我们假设当前目录是我们要从中克隆 Git 仓库的位置。然后,我们在当前目录中创建一个名为 my_home_dir 的新文件夹。

$ repo_path="tutorials/linux-bash/command-line-arguments/src/main/bash"

为了获取脚本 users-loop.sh 的绝对路径,我们首先将两个变量的值组合起来:my_home_dir(仓库所在目录)和 repo_root(仓库的根目录)。

让我们看一个可能的解决方案 −

$ file_path="$my_home_dir/$repo_path"
$ echo $file_path
/home/shubh/baeldung//tutorials/linux-bash/command-line-arguments/src/main/bash

正如我们在这里看到的,file_path 保存的是文件 user-loops.sh 的完整路径。现在让我们使用这个 file_path 列出 (ls) 文件 user-loop.sh -

$ ls -lrt $file_path/users-loop.sh
-rw-r--r-- 1 shubh shubh 86 May 3 18:07 /home/shubh/baeldung//tutorials/linux-bash/command-line-arguments/src/main/bash/users-loop.sh

如上所示,我们的重写规则完全符合我们的预期。但请注意,正则表达式本身不会对斜杠 (/) 进行转义。因此,如果您的服务器配置允许在正则表达式中使用此类字符,请确保对其进行正确转义。否则,您可能会得到意想不到的结果。

$ echo $my_home_dir
/home/shubh/baeldung/

$ repo_base_dir="${my_home_dir}///tutorials" && echo $repo_base_dir
/home/shubh/baeldung////tutorials

$ ls -ld $repo_base_dir/linux-bash
drwxr-xr-x 1 shubh shubh 512 May 3 18:07 /home/shubh/baeldung////tutorials/linux-bash

成功了!Unix 路径中多个 \/ 不会造成问题。不过,为了更清晰起见,建议删除路径中多余的正斜杠。我们可以利用 realpath 实用程序来实现这一点 -

$ ls -ld $(realpath ${repo_base_dir})/linux-bash
drwxr-xr-x 1 shubh shubh 512 May 3 18:07 /home/shubh/baeldung/tutorials/linux-bash

我们在这里使用命令替换来运行 realpath 命令,同时显示目录内容。

处理特殊情况的通用解决方案案例

我们在前面几节讨论了连接包含 Linux 路径的字符串的技巧。但是,可能存在一些特殊情况,现在让我们来看一下。

如果有人传递一个空字符串或使用相对路径与第一个路径连接,会发生什么?

开始吧!让我们看看我们的解决方案是否适用于上述特殊情况。

concatenate_paths() {
   base_path=${1}
   sub_path=${2}
   full_path="${base_path:+$base_path/}$sub_path"
   full_path=$(realpath ${full_path})
   echo $full_path
}

我们创建了一个名为 concatenate_path 的 Bash 函数,它接受两个输入路径作为参数。

这里,第一个参数保存到 base_path 变量中,第二个参数保存到 sub_path 变量中;然后,我们使用 Shell 参数化来处理基本路径为空的情况。

${base_path:+$base_path/

在上述情况下,如果未设置 base_path,则不进行任何替换。否则,base_path 将被替换为"base_path/"。因此,只有设置了 base_path 时,我们才会将文件分隔符添加到基本路径中。稍后我们将处理多个斜杠的情况。此外,realpath 命令还允许我们在连接字符串时处理多个斜杠的情况。

让我们通过运行一些示例来检查代码。

$ concatenate_paths "/home/shubh//" "baeldung//linux/"
/home/shubh/baeldung/linux

$ concatenate_paths "/home/shubh//baeldung/linux" "foo.bar"
/home/shubh/baeldung/linux/foo.bar

结果与我们的预测相符。现在让我们看看是否可以将空字符串作为第二个参数 -

$ concatenate_paths "" "/home/shubh//baeldung/linux/foo.bar"
/home/shubh/baeldung/linux/foo.bar

$ ls -lrt $(concatenate_paths "/home/shubh//baeldung/linux" "foo.bar")
-rw-r--r-- 1 shubh shubh 0 May 3 21:02 /home/shubh/baeldung/linux/foo.bar

它生成了正确的路径,然后我们通过使用绝对路径进行测试来验证这一点。现在让我们改为使用相对路径。

$ ls -lrt $(concatenate_paths "/home/shubh//baeldung/" "./linux/foo.bar")
-rw-r--r-- 1 shubh shubh 0 五月 3 21:02 /home/shubh/baeldung/linux/foo.bar

这里我们显示了与第一个输入相比的相对路径(使用点运算符),效果很好。现在让我们将示例稍微复杂一些,看看它是否仍然有效 -

$ ls -lrt $(concatenate_paths "/home/shubh//baeldung/linux" "../linux/foo.bar")
-rw-r-- 1 shubh shubh 0 五月 3 21:02 /home/shubh/baeldung/linux/foo.bar

它运行流畅!因此,我们能够验证上面讨论的所有情况。

结论

我们研究了在 Linux 中构建路径的不同方法。

我们首先查看了一个实际问题的示例。然后,我们学习了一些可以用来解决问题的基本技巧。

然后,我们讨论了构建完整路径时可能出现的一些特殊情况。

我们编写了一个通用解决方案来处理这些特殊情况。


相关文章


有用资源