2014-03-02 80 views
1

我做了一個非常簡單的腳本,告訴我一個文件名和擴展名。 該腳本的工作原理如下:沒有擴展名的文件:如何注意bash腳本?

for file in * ; do 
    if [[ -f $file ]] ; then 
     filename=${file##*/} 
     basename=${filename%\.*} 
     extension=${filename##*.} 
     if [[ -n $extension ]] ; then 
      echo "FILE: " $basename " ; ESTENSIONE " $extension 
     fi 
    fi 
done 

的問題是,當我有沒有擴展名(例如Makefile文件)的文件,它說的是,擴展文件名本身(例如延長= Makefile文件)。 我做錯了什麼?

+0

如果您只想處理包含點的文件名,請將第一個通配符更改爲「*。*'。 – tripleee

回答

3

那麼,你得到的結果是預期的結果;我不知道這是否意味着你做錯了事。

模式替換工作的方式是,如果模式不匹配,則不會替換任何內容。在這裏你有${filename##*.}它說刪除所有字符,幷包括最後期限。但是,如果名稱中沒有句號,則模式不匹配,也不會刪除任何內容,因此您只需得到與${filename}相同的結果即可。

我應該指出${filename%\.*}中的反斜槓是無用的:這裏的模式是shell通配但不是正則表達式,所以你不需要轉義一段時間。你可以寫${filename%.*}

ETA:

有沒有辦法做你一步到位想要的東西。你有兩個選擇;你可以測試一下,看是否擴展名的文件名相同,如果是將其設置爲空:

extension=${filename##*.} 
[ "$extension" = "$filename" ] && extension= 

,或者你可以脫掉的基本部分,你已經計算,然後擺脫任何前導時期:

extension=${filename#$basename} 
extension=${extension##*.} 
+0

謝謝你的回答!問題是如果沒有擴展名,我希望它返回一個空字符串。在這一點上,我可以檢查擴展名和文件名是否相同,我想 –

+1

嗯,這不是你問的:-)。 – MadScientist

2

擴展在Unix文件系統中沒有任何特權狀態;它們只是人們特別對待的文件名稱的一部分。您必須先檢查文件是否包含.

basename=${filename%\.*} 
    if [[ $filename = *.* ]]; then 
     extension=${filename##*.} 
     echo "FILE: " $basename " ; ESTENSIONE " $extension 
    else 
     extension="" 
    fi 
相關問題