检查shell变量是否包含绝对路径

Wil*_*ard 3 bash string shell-script filenames posix

我想检查 shell 变量是否包含绝对路径。

我不在乎路径是否存在——如果它不存在,我将创建它——但我确实想确保我正在处理一个绝对路径名。

我的代码如下所示:

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

或者,要验证的绝对路径是目录的用例:

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

如果是这样,awk我会像这样进行检查:myvar ~ /^\//

还有必须是干净的方式与外壳的字符串处理要做到这一点,但我有想出它的麻烦。

(提及一个bash特定的解决方案会很好,但我想知道如何以可移植的方式执行此操作。POSIX 字符串处理似乎应该足够了。)

Wil*_*ard 6

[ "$1" != "${1#/}" ] || return 1
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法(这就是我问的原因)。此代码剥去任何前导/$1和检查的结果是一样$1本身。


mik*_*erv 6

你可以这样做:

case $1 in (/*) pathchk -- "$1";; (*) ! : ;; esac
Run Code Online (Sandbox Code Playgroud)

那应该就够了。它会将诊断写入 stderr 并返回无法访问或无法创建的组件的故障。pathchk不是关于现有的路径名——而是关于可用的路径名。

pathchk实用程序应检查一个或多个路径名是否有效(即,它们可用于访问或创建文件而不会导致语法错误)和可移植性(即,不会导致文件名截断)。该-p选件提供了更广泛的便携性检查。

默认情况下,该pathchk实用程序应pathname根据底层文件系统检查每个操作数的每个组件。应为每个pathname操作数编写诊断:

  • 长于{PATH_MAX}字节(参见<limits.h> 中的路径名变量值 )

  • {NAME_MAX}在其包含目录中包含长于字节的任何组件

  • 包含目录中不可搜索的任何组件

  • 包含在其包含目录中无效的任何组件中的任何字符

诊断消息的格式没有规定,但应指明检测到的错误和相应的pathname操作数。

如果pathname操作数的一个或多个组件不存在,只要pathname可以创建与缺失组件指定的文件匹配的文件,并且不违反任何上述指定的检查,则不应将其视为错误。

  • 我不知道“pathchk”命令。*完美。*我会保持打开状态一段时间,看看是否有更好的东西出现,但我认为你已经做到了——“case”开关加上一个实际上设计用于检查路径名的命令。:) (2认同)
  • @cuonglm - 真的。或`[ ${1:+"!"} "${1%%/*}" ]` (2认同)