Bash
檢查shell變數是否包含絕對路徑
我想檢查一個 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
*可以創建與缺少組件指定的文件匹配且不違反上述任何檢查的文件,則不應將其視為錯誤。