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

1

Estou trabalhando em código bash e encontrei uma função CheckOtherFiles que eu acho que é usada para verificar se um arquivo ( ) é mais recente do arquivo $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=
   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 descobri este link útil, mas não está claro o significado de:

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

Eu também duvido que haja um erro.

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

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

    
por Lety 19.11.2014 / 15:28

1 resposta

1

Como foi respondido na pergunta relacionada, esta é a remoção da substring :

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

Nesse caso, ele está removendo o caminho e retendo apenas o basename :

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

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

No entanto, você pode considerar os -nt e -ot tests :

f1 -nt f2
   file f1 is newer than f2

f1 -ot f2
   file f1 is older than f2

E talvez simplifique:

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