Bash

檢查shell變數是否包含絕對路徑

  • January 15, 2018

我想檢查一個 shell 變數是否包含絕對路徑。

我不在乎路徑是否存在——如果不存在,我將創建它——但我確實想確保我處理的是絕對路徑名。

我的程式碼如下所示:

myfunction() {
 [ magic test to see if "$1" is an absolute path ] || return 1
 mkdir -p "$(dirname "$1")" || return 1
 commands >> "$1"
}

或者,要驗證的絕對路徑是目錄的案例:

anotherfunction() {
 [ same magic test ] || return 1
 mkdir -p "$1"
 dostuff >> "$1/somefile"
}

如果是這樣,awk我會像這樣進行檢查:myvar ~ /^\//

必須有一種干淨的方法來處理 shell 的字元串處理,但我在想出它時遇到了麻煩。

(提到一個特定的bash解決方案很好,但我也想知道如何便攜地做到這一點。POSIX 字元串處理似乎就足夠了。)

你可以這樣做:

case $1 in (/*) pathchk -- "$1";; (*) ! : ;; esac

這應該足夠了。它會將診斷寫入 stderr 並返回無法訪問或無法創建的組件的故障。pathchk現有路徑名無關 - 它與可用路徑名有關。

pathchk實用程序應檢查一個或多個路徑名是否有效*(即,它們可用於訪問或創建文件而不會導致語法錯誤)和可移植性(即沒有文件名截斷結果)*。-p該選項提供了更廣泛的可移植性檢查。

預設情況下,實用程序應根據底層文件系統pathchk檢查每個操作數的每個組件。*pathname應為每個pathname*操作數編寫診斷:

  • {PATH_MAX}字節長*(參見 <limits.h>中的路徑名變數值)*
  • 在其包含目錄中包含任何長度超過{NAME_MAX}字節的組件
  • 包含目錄中不可搜尋的任何組件
  • 包含在其包含目錄中無效的任何組件中的任何字元

診斷消息的格式沒有規定,但應指出檢測到的錯誤和相應的*pathname*操作數。

*pathname如果操作數的一個或多個組件不存在,只要pathname*可以創建與缺少組件指定的文件匹配且不違反上述任何檢查的文件,則不應將其視為錯誤。

引用自:https://unix.stackexchange.com/questions/256434