我正在研究 bash 代码,我发现一个函数CheckOtherFiles
,我猜测它是用来检查一个文件($1
)是否比文件更新$WS_ROOT/$NomeVista/COMP/COMP_COMPILE
。
CheckOtherFiles
被调用时会用一个参数,即具有绝对路径的文件。
以下是代码:
function CheckOtherFiles {
fver=$1
if [[ -r $fver ]]
then
if [[ -r $WS_ROOT/$NomeVista/COMP/COMP_COMPILE ]]
then
filecheck=`/bin/ls -1t $fver $WS_ROOT/$NomeVista/COMP/COMP_COMPILE | head -1`
if [[ ${filecheck##*/} = ${fver##*/} ]]
then
return 1
fi
fi
fi
return 0
}
我阅读了 bash 手册并发现这有用的链接,但含义不清楚:
if [[ ${filecheck##*/} = ${fver##*/} ]]
我也怀疑其中有错误。
那么,你能帮助我理解这段代码的含义吗?
我也非常感谢任何有关改进此功能的建议。
答案1
正如链接问题所回答的那样,这是子串删除:
${string##substring}
Deletes longest match of $substring from front of $string.
在这种情况下,它会删除路径并仅保留basename
:
$ FILE=/etc/default/google-chrome
$ echo ${FILE##*/}
google-chrome
$ basename $FILE
google-chrome
通常情况下,我会坚持使用basename
,但如果只写代码更快,那么它是否更好,这是一个见仁见智的问题。无论如何,我没有发现其中有什么错误。
然而,你可以考虑-nt
和-ot
测试:
f1 -nt f2
file f1 is newer than f2
f1 -ot f2
file f1 is older than f2
或许可以将其简化为:
other_file="$WS_ROOT/$NomeVista/COMP/COMP_COMPILE"
if [[ -r $fver && -r $other_file && ( $fver -nt $otherfile ) ]]
then
return 1
fi
return 0