Bash:${parameter##word} 的意思是什麼

Bash:${parameter##word} 的意思是什麼

我正在研究 bash 程式碼,我發現了一個函數CheckOtherFiles,我猜它是用來檢查 file ( $1) 是否比 file 更新的$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

相關內容