Bash解析if [“$ s1”==“s2”]作为命令

时间:2013-04-29 23:48:38

标签: bash ubuntu

这是我的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

2 个答案:

答案 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或其他更现代的语言进行重写。