使用 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 也允许在表达式前匹配左括号。)
我知道我可以使用 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 也允许在表达式前匹配左括号。)