我想检查 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