2013-07-10 2 views
0

У меня есть скрипт python p.py который делает exit("ABC") для некоторых файлов. Я хотел бы написать оболочку Ubuntu для копирования файлов, которые делают сценарий exit("ABC") в папку:Условная проверка в оболочке

#!/bin/bash 

FILES=*.txt 
TOOL=p.py 
TAREGT=../TARGET/ 

for f in $FILES 
do 
    if [ $(python $TOOL $f) = "ABC" ] 
    then 
     echo "$f" 
     cp $f $TARGET 
    fi 
done 

но проверка состояния if [ $(python $TOOL $f) = "ABC" ] не похожа на работу, он говорит ./filter.sh: line 13: [: =: unary operator expected. Может ли кто-нибудь сказать мне, что не так?

+1

Это "баш" сценарий, а не "Ubuntu" сценарий , Независимо от того, работаете ли вы на Ubuntu, AIX или Cygwin, это не делает (большую часть) разницу. (Аналогично, это сценарий «Python», независимо от того, где вы его запускаете.) – DevSolar

ответ

1

Параметр exit() - это то, что скрипт Python возвращает (успех/ошибка). (Documentation из Питона exit(). Обратите внимание, как exit("ABC") не возвращает "ABC", но печатает что в stderr и возвращает1.)

Код возврата, что заканчивается в $? переменной вызывающей оболочки, или что вы могли бы проверить, как это:

# Successful if return code zero, failure otherwise. 
# (This is somewhat bass-ackwards when compared to C/C++/Java "if".) 
if python $TOOL $f 
then 
    ... 
fi 

$(...) конструкция заменяется на выходе вызываемого скрипта/execut возможно, совсем другое.

И если вы сравниваете строки, вы должны процитировать их

if [ "$(python $TOOL $f)" = "ABC" ] 

или использовать улучшенный тест BASh в [[:

if [[ $(python $TOOL $f) = "ABC" ]] 
+0

Спасибо, но в моем 'p.py' есть несколько видов выхода:' exit ("ABC") ',' exit («DEF») и т. Д., Как я могу проверить разные возможности в оболочке? – SoftTimur

+1

@SoftTimur: Было бы неплохо обратиться к [документации] (http://docs.python.org/2/library/sys.html#sys.exit) функций, которые вы используете. Любой ненулевой/ненулевой параметр 'exit()' указывает ** сбой ** вашего скрипта на любых вызывающих абонентов. Я серьезно сомневаюсь, что это то, что вы ищете, поэтому ваш сценарий должен печатать свои результаты для вывода и выхода с успехом (т. Е. 'Exit (0)'). – DevSolar

+1

@SoftTimur В частности, ваш код выхода должен быть целым числом от 0 до 255 (или от -128 до 127, в зависимости от того, обрабатываете ли вы его как подписанное или неподписанное), но оно должно быть однобайтовым значением) ... – twalberg

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