在 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/”。因此,只有在设置 base_paht 时,我们才会将文件分隔符添加到 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 May 3 21:02 /home/shubh/baeldung/linux/foo.bar

这里我们显示了相对于第一个输入的相对路径(带有点运算符),它工作正常。现在让我们使我们的示例更复杂一些,看看它是否仍然有效 -

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

它运行得非常顺利!因此,我们能够验证上面讨论的所有情况。

结论

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

我们首先研究了该问题的真实示例。然后,我们研究了一些可用于解决该问题的基本技术。

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

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

更新于:2022-12-26

587 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.