在 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 中构建路径的不同方法。
我们首先研究了该问题的真实示例。然后,我们研究了一些可用于解决该问题的基本技术。
然后我们讨论了在构建完整路径时可能出现的一些特殊情况。我们编写了一个通用解决方案来处理特殊情况。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP