2013-04-29 4 views
1

Вот мой Баш скрипт:

#!/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

Быстрый ответ - введите пробел после '[', вокруг '==' и перед '' '. Более полный ответ: [Неожиданный сценарий '' then 'bash] (http://stackoverflow.com/questions/16092963/unexpected-then-bash-script) –

ответ

2

Вы упускаете пространства после того, как и перед [ и ] соответственно. Возможно также вокруг ==: язык сценариев

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

Это потому, что '[' фактически * есть * команда. Он встроен в современные оболочки, но раньше существовало (и на некоторых системах) '/ bin/[' (это жесткая ссылка на '/ bin/test'). Оператор 'if' принимает * любую команду * и действует на основе кода возврата. –

0

Оболочка истолковано Баш довольно странно. Ваша проблема здесь в том, что вам нужно положить пробел после [ и до ]. Кроме того, вам нужно использовать один =, а не пару из них, например, ==. Собираем вместе:

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

На самом деле, [ в сценарий оболочки является синтаксический сахар для команды test. Для того, чтобы выяснить, что вы можете или не можете сделать с [, прочитайте инструкцию запись для теста:

# man 1 test 

Насколько мне известно, в оригинальной оболочке Борна, [ никогда не встроенный, а когда sh запускает скрипт оболочки, он полагается на фактическую исполняемую программу /usr/bin/[! Но в Bash это встроенный. Поэтому использование [ с Bash позволяет избежать дополнительных затрат на выполнение дополнительного процесса. Поскольку он является встроенным, вы должны рассмотреть страницу руководства для bash, чтобы быть окончательным полномочием по юридическому синтаксису, но я думаю, что на практике это то же самое, что и документация для команды test.

В любом случае, поскольку в оболочке Bourne выполнялась фактическая команда, ему нужно было иметь пробел после этого, чтобы отделить команду от своих аргументов, и я думаю, что в Bash они просто продолжали применять этот синтаксис, чтобы сделать скрипты Bash более переносится в системы с использованием sh вместо bash.

P.S. Мне нравится использовать более современный язык для нетривиальных скриптов. Если вы продолжаете работать над своим скриптом, а синтаксис сценария оболочки становится болезненным, подумайте о переписывании на Python или другом более современном языке.

Смежные вопросы