这是我的bash脚本:
#!/bin/bash -x
for file in /home/sam/Desktop/RecoveredPix/*
do
model=$(exif -m -t Model $file)
if ["$model"=="Canon EOS REBEL T3i"]; then
echo $file >> /home/sam/Desktop/mypix.txt;
fi
done
您好, 我有一堆照片,我恢复了,我正在寻找我的相机拍摄的照片,T3i。我在exif数据中编写了这个脚本的模型,如果匹配“Canon EOS REBEL T3i”,它的路径将附加到文件中。但是,运行此脚本后,我会在终端中返回:
+ for file in '/home/sammeh/Desktop/100CANON/*'
++ exif -m -t Model /home/sammeh/Desktop/100CANON/IMG_0019.JPG
+ model='Canon EOS REBEL T3i'
+ '[Canon EOS REBEL T3i==Canon EOS REBEL T3i]'
/home/sammeh/Desktop/Search Pix.sh: line 5: [Canon EOS REBEL T3i==Canon EOS REBEL T3i]: command not found
这是在仅为验证功能而拍摄的已知照片上完成的。但是,您可以看到bash正在将if语句解析为命令。有帮助吗?谢谢!
我正在运行Ubuntu 13.04 x64
答案 0 :(得分:2)
您分别错过[
和]
之前和之后的空格。可能还围绕==
:
if [ "$model" == "Canon EOS REBEL T3i" ]; then
答案 1 :(得分:0)
bash解释的shell脚本语言非常奇怪。您的问题是,您需要在[
之后和]
之前添加空格。此外,您需要使用单个=
,而不是像==
这样的一对if [ "$model" = "Canon EOS REBEL T3i" ]; then
。把它放在一起:
[
实际上,shell脚本中的test
是[
命令的语法糖。要了解使用# man 1 test
可以做什么或不能做什么,请阅读测试的手册条目:
[
据我所知,在最初的Bourne shell中,sh
永远不是内置的,当/usr/bin/[
运行shell脚本时,它依赖于实际的可执行程序{{1 }}!但在Bash中它是一个内置的。因此,将[
与Bash一起使用可以避免运行其他进程的开销。由于它是内置的,因此您应该将bash
的手册页视为法律语法的最终权限,但我认为实际上它与test
命令的文档相同
无论如何,因为在Bourne shell中它是一个正在执行的实际命令,它需要在它之后有空格以将命令与其参数分开,我想在Bash中他们只是继续强制执行该语法以使Bash脚本更具可移植性使用sh
代替bash
的系统。
P.S。我喜欢使用更现代的语言来处理非平凡的脚本。如果您继续处理脚本并且shell脚本语法变得很痛苦,请考虑使用Python或其他更现代的语言进行重写。