2016-01-20 54 views

回答

6

嘗試(假定猛砸V3.0 +,使用=~,正則表達式匹配運算符):

if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ... 

如果你想匹配file的輸出更密切:

if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ... 

這將僅在輸出開始以 'JPEG',弗洛匹配由空間結婚。

另外,如果你想用一個通配式的模式:

if [[ $(file -b 'pic.jpg') == 'JPEG '* ]]; then ... 

POSIX兼容的條件表達式([ ... ])做提供正則表達式或模式匹配,所以不同方法是需要的:

if expr "$(file -b 'pic.jpg')" : 'JPEG ' >/dev/null; then ... 

注:expr onl y支持基本的正則表達式,並隱式錨定在字符串的開頭(不需要^)。


至於爲什麼[[ ... ]]而非[ ... ]需要在Bash片段:
高級特性,如正則表達式運算符(=~)或模式匹配(例如,使用無引號*來表示字符的任何序列)是非標準的(不屬於POSIX shell規範的一部分)。
由於這些功能與不兼容與標準條件([ ... ])的工作方式有關,因此需要新的語法; Bash,Ksh和Zsh使用[[ ... ]]

+0

對不起,我是shell腳本的新手。你能解釋爲什麼你需要兩個[]? – user116064

+0

@ user116064:請參閱我的更新。 – mklement0

2

爲JPEG文件時,file -b輸出有JPEG作爲上線的第一個字:

pax> file -b somefile.jpg 
JPEG image data, JFIF standard 1.01, blah blah blah 

所以,你可以使用的東西,如檢測到它:

inputFile=somefile.jpg 
if [[ $(file -b $testFile | awk '{print $1}') == "JPEG" ]] ; then 
    echo $inputFile is a JPEG file. 
fi 
+0

++的詳細解釋,但在這種情況下使用'awk'看起來像是過度殺傷。 – mklement0

3

好老case也值得一提。

case $(file -b pic.jpg) in 
    'JPEG '*) 
    echo is 
    ;; 
    *) 
    echo is not 
    ;; 
esac 

獨行右括號聽起來有點不可思議,但除此之外,這是相當簡單的,可讀的,多功能的,並回到原來的Bourne shell移植的方法。 (POSIX也允許在表達式之前匹配左括號。)

相關問題