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

Linux 使用shell脚本检查文件是否为jpeg格式,linux,bash,shell,unix,sh,Linux,Bash,Shell,Unix,Sh,我知道我可以使用文件pic.jpg来获取文件类型,但是如何在shell脚本中编写if语句来检查它呢 例如,伪代码: if pic.jpg == jpeg file then Try假设Bash v3.0+,使用=~,正则表达式匹配运算符: if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ... 如果要更紧密地匹配文件的输出,请执行以下操作: if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ... 仅当输

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

例如,伪代码:

if pic.jpg == jpeg file then
Try假设Bash v3.0+,使用=~,正则表达式匹配运算符:

if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ...
如果要更紧密地匹配文件的输出,请执行以下操作:

if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ...
仅当输出以“JPEG”开头,后跟空格时,此选项才匹配

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

if [[ $(file -b 'pic.jpg') == 'JPEG '* ]]; then ...
POSIX兼容条件[…]不提供正则表达式或模式匹配,因此需要一种不同的方法:

if expr "$(file -b 'pic.jpg')" : 'JPEG ' >/dev/null; then ...
注意:expr只支持基本正则表达式,并且隐式地锚定在字符串的开头,不需要^

至于Bash代码段中为什么需要[…]而不是[…]: 高级功能,如正则表达式操作符=~或模式匹配,例如,使用unquoted*表示任何字符序列。是非标准的,不是POSIX外壳规范的一部分。 由于这些特性与标准条件句[…]的工作方式不兼容,因此需要一种新的语法;Bash、Ksh和Zsh使用[…]。

Try假设Bash v3.0+,使用=~,正则表达式匹配运算符:

if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ...
如果要更紧密地匹配文件的输出,请执行以下操作:

if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ...
仅当输出以“JPEG”开头,后跟空格时,此选项才匹配

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

if [[ $(file -b 'pic.jpg') == 'JPEG '* ]]; then ...
POSIX兼容条件[…]不提供正则表达式或模式匹配,因此需要一种不同的方法:

if expr "$(file -b 'pic.jpg')" : 'JPEG ' >/dev/null; then ...
注意:expr只支持基本正则表达式,并且隐式地锚定在字符串的开头,不需要^

至于Bash代码段中为什么需要[…]而不是[…]: 高级功能,如正则表达式操作符=~或模式匹配,例如,使用unquoted*表示任何字符序列。是非标准的,不是POSIX外壳规范的一部分。 由于这些特性与标准条件句[…]的工作方式不兼容,因此需要一种新的语法;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
对于JPEG文件,文件-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
好的老案子也值得一提

case $(file -b pic.jpg) in
  'JPEG '*)
    echo is
    ;;
  *)
    echo is not
    ;;
esac
单独的右括号一开始可能看起来很奇怪,但除此之外,这相当简单,可读性好,通用性强,便于携带,可以追溯到最初的Bourne shell。POSIX还允许在表达式前使用匹配的左括号。

好的旧大小写也值得一提

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

单独的右括号一开始可能看起来很奇怪,但除此之外,这相当简单,可读性好,通用性强,便于携带,可以追溯到最初的Bourne shell。POSIX也允许在表达式前使用匹配的左括号。

++用于详细解释,但在本例中使用awk似乎有些过分。++用于详细解释,但在本例中使用awk似乎有些过分。