Bash: was bedeutet ${parameter##word}

Bash: was bedeutet ${parameter##word}

Ich arbeite an Bash-Code und habe eine Funktion gefunden CheckOtherFiles, die vermutlich dazu dient, zu überprüfen, ob eine Datei ( $1) aktueller ist als die Datei $WS_ROOT/$NomeVista/COMP/COMP_COMPILE.

CheckOtherFileswird mit einem Parameter aufgerufen, der eine Datei mit absolutem Pfad ist.

Hier ist der Code:

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
}

Ich habe das Bash-Handbuch gelesen und festgestelltDasnützlicher Link, aber die Bedeutung ist unklar:

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

Ich bezweifle auch, dass da ein Fehler drin ist.

Könnten Sie mir also bitte helfen, die Bedeutung dieses Codestücks zu verstehen?

Außerdem bin ich für jeden Vorschlag zur Verbesserung dieser Funktion sehr dankbar.

Antwort1

Wie in der verlinkten Frage beantwortet, ist diesTeilzeichenfolgenentfernung:

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

In diesem Fall wird der Pfad entfernt und nur derbasename:

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

Normalerweise würde ich bei bleiben basename, aber es ist Ansichtssache, ob schreibgeschützter Code besser ist, wenn er schneller ist. Ich sehe darin jedenfalls keinen Fehler.

Sie könnten jedoch die-ntund -otTests:

f1 -nt f2
   file f1 is newer than f2

f1 -ot f2
   file f1 is older than f2

Und vielleicht vereinfachen Sie es zu:

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

verwandte Informationen