在 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 中構建路徑的不同方法。
我們首先研究了該問題的真實示例。然後,我們研究了一些可用於解決該問題的基本技術。
然後我們討論了在構建完整路徑時可能出現的一些特殊情況。我們編寫了一個通用解決方案來處理特殊情況。