我知道我可以使用#include <sys/time.h>
#include <signal.h>
void alarmhandler(){
printf("\nTimer triggered");
}
void main(){
struct itimerval timerval;
signal(SIGALRM, alarmhandler);
timerval.it_value.tv_sec = 1;
timerval.it_value.tv_usec = 0;
timerval.it_interval.tv_sec = 30;
timerval.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &timerval, 0);
pause();
}
来获取文件类型,但是如何编写file pic.jpg
语句以在shell脚本中检查它?
E.g。 (伪代码):
if
答案 0 :(得分:8)
尝试(假设 Bash v3.0 + ,使用=~
,正则表达式匹配运算符):
if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ...
如果您想更紧密地匹配file
的输出:
if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ...
仅当输出以&#39; JPEG&#39;开头,后跟空格时才会匹配。
或者,如果您更喜欢使用通配样式:
if [[ $(file -b 'pic.jpg') == 'JPEG '* ]]; then ...
POSIX兼容条件([ ... ]
)不提供正则表达式或模式匹配,因此需要采用不同的方法:
if expr "$(file -b 'pic.jpg')" : 'JPEG ' >/dev/null; then ...
注意:expr
仅支持基本正则表达式,并隐式锚定在字符串的开头(不需要^
)。
至于为什么在Bash片段中需要[[ ... ]]
而不是[ ... ]
:
高级功能(如正则表达式运算符(=~
)或模式匹配(例如,使用不带引号的*
来表示任何字符序列。)是非标准的(不是POSIX shell规范的一部分)。 />
由于这些功能不兼容标准条件([ ... ]
)如何工作,因此需要新的语法; Bash,Ksh和Zsh使用[[ ... ]]
。
答案 1 :(得分:3)
好老case
也值得一提。
case $(file -b pic.jpg) in
'JPEG '*)
echo is
;;
*)
echo is not
;;
esac
单独的右括号起初看起来似乎是不可思议的,但除此之外,这是相当简单,可读,多功能和可移植的方式回到原始的Bourne shell。 (POSIX也允许在表达式之前匹配左括号。)
答案 2 :(得分:2)
对于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