我知道我可以使用file pic.jpg
來獲取文件類型,但是如何編寫if
語句來在shell腳本中檢查它?使用shell腳本檢查文件是否爲jpeg格式
E.g. (僞代碼):
if pic.jpg == jpeg file then
我知道我可以使用file pic.jpg
來獲取文件類型,但是如何編寫if
語句來在shell腳本中檢查它?使用shell腳本檢查文件是否爲jpeg格式
E.g. (僞代碼):
if pic.jpg == jpeg file then
嘗試(假定猛砸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使用[[ ... ]]
。
爲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
++的詳細解釋,但在這種情況下使用'awk'看起來像是過度殺傷。 – mklement0
好老case
也值得一提。
case $(file -b pic.jpg) in
'JPEG '*)
echo is
;;
*)
echo is not
;;
esac
獨行右括號聽起來有點不可思議,但除此之外,這是相當簡單的,可讀的,多功能的,並回到原來的Bourne shell移植的方法。 (POSIX也允許在表達式之前匹配左括號。)
對不起,我是shell腳本的新手。你能解釋爲什麼你需要兩個[]? – user116064
@ user116064:請參閱我的更新。 – mklement0