1

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

4

2 回答 2

2

您分别在[and之后和之前缺少空格]。可能也在周围==

if [ "$model" == "Canon EOS REBEL T3i" ]; then
于 2013-04-29T23:52:00.883 回答
0

bash 解释的 shell 脚本语言非常奇怪。在这里,您的问题是您需要在 . 之后[和 . 之前放置一个空格]。此外,您需要使用一个=,而不是一对像==. 把它放在一起:

if [ "$model" = "Canon EOS REBEL T3i" ]; then

实际上,[在 shell 脚本中是test命令的语法糖。要了解您可以做什么或不能做什么[,请阅读 test 的手册条目:

# man 1 test

据我所知,在最初的 Bourne shell 中,[它从来都不是内置的,并且在sh运行 shell 脚本时它依赖于实际的可执行程序/usr/bin/[!但在 Bash 中,它是内置的。因此,[与 Bash 一起使用可以避免运行额外进程的开销。由于它是内置的,因此您应该将手册页视为bash法律语法的最终权威,但我认为在实践中它与该test命令记录的内容相同。

无论如何,因为在 Bourne shell 中它是一个正在执行的实际命令,所以它后面需要有空格来将命令与其参数分开,我猜在 Bash 中,他们只是继续强制执行该语法以使 Bash 脚本更便于使用sh而不是bash.

PS 我喜欢使用更现代的语言来编写非平凡的脚本。如果您继续编写脚本并且 shell 脚本语法变得很痛苦,请考虑用 Python 或其他更现代的语言重写。

于 2013-04-30T00:05:41.547 回答