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

检查 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 字符串处理似乎应该足够了。)

答案1

你可以这样做:

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

那应该足够了。它将诊断信息写入 stderr 并返回无法访问或无法创建的组件的失败。pathchk不是关于现存的路径名 - 这是关于可用的路径名。

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

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

  • {PATH_MAX}比字节长(请参阅路径名变量值 <限制.h>

  • {NAME_MAX}包含其所在目录中长度超过字节的任何组件

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

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

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

如果一个或多个组件的一个或多个组成部分不应被视为错误pathname只要文件匹配,操作数就不存在pathname可以创建由缺少的组件指定的不违反上面指定的任何检查的组件。

答案2

[ "$1" != "${1#/}" ] || return 1

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

答案3

模式匹配是通过case所有类似 Bourne 的 shell 中的语句来完成的。

is_absolute() {
  案例“$1”
    ///* | //) 真的;;
          //*) 错误的;; #在某些系统上,//foo 是特殊的并且是
                       # 不是绝对路径。 // 唯一的是/
           /*) 真的;;
            *) 错误的
  埃萨克
}

在不进行特殊处理的系统上删除前两个条目//foo

答案4

如果通过绝对路径你的意思是它以 开头/,我们正在讨论bash(如标签所示):

$ var1='/tmp/foo'
$ var2='tmp/foo'

$ [[ "$var1" =~ ^/ ]] && echo yes || echo no
yes
$ [[ "$var2" =~ ^/ ]] && echo yes || echo no
no

相关内容