2013-04-29 53 views
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 64

+0

快速回答 - 在'[',在'=='周圍,在']'之前放一個空格。更完整的答案:[意外\'然後'bash腳本](http://stackoverflow.com/questions/16092963/unexpected-then-bash-script) – 2013-04-29 23:51:08

回答

2

你以後和以前[],分別缺失的空間。可能還在==附近:

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

這是因爲'['實際*是*一個命令。它是現代shell中的內置,但曾經是(並且在某些系統上仍然是)'/ bin/['(它是'/ bin/test'的硬鏈接)。 'if'語句需要*任何*命令並根據其返回碼進行操作。 – 2013-04-29 23:55:51

0

由bash解釋的shell腳本語言很奇怪。您的問題在於,您需要在[之後和]之前放置空格。此外,您需要使用一個=,而不是像==那樣的一對。將其組合在一起:

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

其實,[在shell腳本是針對test命令語法糖。要找出你可以或不能[做什麼,請閱讀測試的手工錄入:

# man 1 test 

據我所知,在原來的Bourne shell,[從來都不是一個內置的,當sh正在運行一個shell腳本,它依賴於一個實際的可執行程序/usr/bin/[!但在Bash中它是一個內置的。因此在Bash中使用[可避免運行額外進程的開銷。由於它是內置的,因此您應該將bash的手冊頁視爲法律語法的最終權威,但我認爲在實踐中它與test命令中記錄的內容相同。

無論如何,因爲在Bourne shell中它是一個正在執行的實際命令,它需要在它將命令從它的參數中分離出來之後留有空白空間,我猜想在Bash中他們只是繼續執行該語法來使Bash腳本更加便攜系統使用sh而不是bash

P.S.我喜歡使用更現代的語言來製作非平凡的腳本。如果你繼續處理你的腳本,並且shell腳本語法變得很痛苦,請考慮用Python或其他一些更現代的語言來重寫。