在 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 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告