Bash: ${parameter##word} の意味は何ですか?

Bash: ${parameter##word} の意味は何ですか?

私は bash コードに取り組んでおり、ファイル ( ) がファイル より新しいCheckOtherFilesかどうかを確認するために使用されると思われる関数を見つけました。$1$WS_ROOT/$NomeVista/COMP/COMP_COMPILE

CheckOtherFiles絶対パスを持つファイルである 1 つのパラメータで呼び出されます。

コードは次のとおりです:

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

関連情報