Bash:${parameter##word} 的含义是什么

Bash:${parameter##word} 的含义是什么

我正在研究 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

相关内容