2012-10-09 123 views
1

在我的腳本中,我試圖帶一個字符串,然後輸出字符串的擴展名(如果有的話)。所以基本上我把一個文件的基本名稱,然後輸出一段時間後的東西。字符串操作Bash擴展

這樣做的語法是什麼?

例如

dotcutter.sh 
file=testfile.jpg 

腳本應該輸出的.jpg

編輯:

我現在已經解決了我的問題:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

從而降低了我的論點來一個基地名稱,謝謝大家。

+0

http://unix.stackexchange.com/questions/1571/grabbing-the-extension-in-a-file-name –

回答

3
$ file=testfile.jpg 
$ echo ${file##*.} 
jpg 
$ file=testfile.ext1.ext2 
$ echo ${file##*.} 
ext2 
$ file=noextension 
$ echo ${file##*.} 
noextension 

要注意,如果文件沒有擴展名這是行不通的。如果是這樣的重要,那麼試試這個兩個步驟的解決方案:

$ file=testfile.ext1.ext2 
$ stub=${file%.*} 
$ echo ${file#"$stub"} 
.ext2 

或者這種基於正則表達式一,這隻會叫echo如果確實有一個擴展。 (&&是簡寫形式, 「如果當時」。)

$ regex='(\.[^.]*)$' 
$ file=testfile.ext1.ext2 
$ [[ $file =~ $regex ]] && echo ${BASH_REMATCH[1]} 
.ext2 
$ file=noextension 
$ [[ $file =~ $regex ]] && echo ${BASH_REMATCH[1]} 

參見:

  • basename(1)
  • dirname(1)
  • Bash FAQ:我如何使用參數擴展?我怎樣才能得到子字符串?我怎樣才能得到沒有擴展名的文件,或只得到一個文件的擴展名?]
+0

OP問'.jpg' –

+0

你能爲我解釋一下,具體是什麼的 '$存根= $每個部分{文件%。*}'' 回聲$ {$#文件 「$存根」}' 做? – Unknown

+0

@BernieMacinflor第一行刪除'。*'擴展名,並將文件名存儲在'$ stub'中。第二部分從'$ file'中刪除'$ stub',這使得擴展名被回顯。 –

1

試試下面的代碼:

file=testfile.jpg 
echo .${file#*.} 

使用parameter expansion

+0

只有在文件名中有多個時纔會刪除第一個時間段。使用'$ {file ## *。}'。 – chepner

+0

通常的擴展只有一個句點。而且,這是OP要求的。 –

+0

我在考慮像'foo.tar.gz'這樣的文件名。擴展名是'gz'還是'tar.gz'? – chepner