使用 shell 脚本检查文件是否为 jpeg 格式

check if a file is jpeg format using shell script

我知道我可以使用 file pic.jpg 来获取文件类型,但是我如何编写一个 if 语句来在 shell 脚本中检查它?

例如(伪代码):

if pic.jpg == jpeg file then

尝试(假设 Bash v3.0+,使用 =~,regex-matching 运算符:

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

如果你想更接近地匹配file的输出:

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

仅当输出 以 'JPEG' 开始 ,后跟 space.

时才会匹配

或者,如果您更愿意使用 globbing-style 模式:

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

POSIX-compliant 条件语句 ([ ... ]) not 提供正则表达式或模式匹配,所以采用不同的方法需要:

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

注意:expr 仅支持 basic 正则表达式,并隐式锚定在字符串的开头(不需要 ^)。


至于为什么 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 }') == "JPEG" ]] ; then
    echo $inputFile is a JPEG file.
fi

好东西case也值得一提。

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

起初,单独的右括号可能看起来很不可思议,但除此之外,这是回到原始 Bourne shell 的相当简单、可读、通用且可移植的方式。 (POSIX 也允许在表达式前匹配左括号。)