Linux 使用shell脚本检查文件是否为jpeg格式
我知道我可以使用文件pic.jpg来获取文件类型,但是如何在shell脚本中编写if语句来检查它呢 例如,伪代码: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 ... 仅当输
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似乎有些过分。