下面具体做了什么?
newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
if expr "x${newProg}" : 'x/' >/dev/null; then
prog="${newProg}"
else
progdir=`dirname "${prog}"`
prog="${progdir}/${newProg}"
fi
Run Code Online (Sandbox Code Playgroud)
在第一行使用expr
到:
$newProg
与基本正则表达式 .* -> \(.*\)$
(锚定在两端)相匹配。这就是其中的任何->
内容。newProg
为括号中写入的捕获子表达式匹配的原始值部分(在 之后的部分->
)。贪婪匹配语义是这样的,它总是捕获并输出最后一个这样的匹配,所以->
输出中永远不会有 a 。
例如,这将解析ls -l
符号链接上的输出以找到目标(给定良好的文件名等,通常的警告)。
在第二行使用expr
一次,以检查新值是否newProg
有开始/
,也就是,它代表的绝对路径。
在这种情况下,prog
只需将其设置为该值。否则,prog
使用dirname
on设置为计算的相对路径$prog
,此代码段中未定义该变量。其效果大概是构建一条相对于该原始位置的路径。
如果您只针对比纯 POSIX 功能更强大的 shell 或环境,那么可能有比expr
. readlink
也是一个非常常用的命令,它可以节省解析ls
.