Bash: qual é o significado de ${parameter##word}

Bash: qual é o significado de ${parameter##word}

Estou trabalhando no código bash e encontrei uma função CheckOtherFilesque acho que é usada para verificar se um file ( $1) é mais recente de file $WS_ROOT/$NomeVista/COMP/COMP_COMPILE.

CheckOtherFilesé chamado com um parâmetro que é um arquivo com caminho absoluto.

Aqui está o código:

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
}

Eu li o manual do bash e descobriesselink útil, mas não está claro o significado de:

   if [[ ${filecheck##*/} = ${fver##*/} ]]

Também duvido que haja um erro nisso.

Então, você poderia me ajudar a entender o significado deste trecho de código?

Também agradeço muito qualquer sugestão para melhorar esta função.

Responder1

Conforme respondido na pergunta vinculada, isso éremoção de substring:

${string##substring}
   Deletes longest match of $substring from front of $string.

Neste caso, está retirando o caminho e retendo apenas obasename:

$ FILE=/etc/default/google-chrome
$ echo ${FILE##*/}
google-chrome
$ basename $FILE
google-chrome

Normalmente, eu continuaria basename, mas é uma questão de opinião se o código somente gravação é melhor se for mais rápido. De qualquer forma, não vejo erro nisso.

No entanto, você pode considerar o-nte -ottestes:

f1 -nt f2
   file f1 is newer than f2

f1 -ot f2
   file f1 is older than f2

E talvez simplifique para:

other_file="$WS_ROOT/$NomeVista/COMP/COMP_COMPILE"
if [[ -r $fver && -r $other_file && ( $fver -nt $otherfile ) ]]
then
    return 1
fi
return 0

informação relacionada