在 Linux 中,如何通过连接两个字符串来构建完整路径?
概述
我们将介绍一些通过将两个路径合并为一个来创建完整 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 中构建路径的不同方法。
我们首先查看了一个实际问题的示例。然后,我们学习了一些可以用来解决问题的基本技巧。
然后,我们讨论了构建完整路径时可能出现的一些特殊情况。我们编写了一个通用解决方案来处理这些特殊情况。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

