Как проверить, что команда perl, встроенная в скрипт bash, возвращает true? - PullRequest
1 голос
/ 28 сентября 2010

Итак, у меня есть bash-скрипт, внутри которого я хотел бы иметь условие, которое зависит от того, что возвращает Perl-скрипт. Идея моего кода заключается в следующем:

for i in $(ls); do
    if $(perl -e "if (\$i =~ /^.*(bleh|blah|bluh)/) {print 'true';}"); then
       echo $i;
   fi;
done

В настоящее время это всегда возвращает true, и когда я попробовал его с [[]] вокруг оператора if, я получил ошибки. Любые идеи кто-нибудь?

P.s. Я знаю, что могу сделать это с помощью grep, но это всего лишь пример. Я хотел бы знать, как заставить Bash использовать вывод Perl в целом

P.p.s Я знаю, что могу сделать это в две строки, установив вывод perl в переменную, а затем протестировав это значение переменной, но я бы предпочел по возможности избегать использования этой дополнительной переменной. Кажется расточительным.

Ответы [ 5 ]

8 голосов
/ 28 сентября 2010

Если вы используете выход , вы можете просто использовать if напрямую. Э.Г.

if perl -e "exit 0 if (successful); exit 1"; then
   echo $i;
fi;

0 - успех, ненулевое значение - сбой, 0 - значение по умолчанию, если вы не вызываете exit.

3 голосов
/ 28 сентября 2010
for file in * ; do
    perl -e "shift =~ /^.*(bleh|blah|bluh)/ || exit 1" "$file" && echo $file: true
done

Вы никогда не должны анализировать вывод ls.По крайней мере, у вас будут проблемы с именами файлов, содержащими пробелы.Кроме того, зачем беспокоиться, когда ваша оболочка может работать самостоятельно?

Кавычка $ file при передаче в скрипт perl позволяет избежать проблем с пробелами в именах файлов (и других специальных символах).Внутренне я избегал расширения переменной bash $ file, чтобы не допустить проблем с цитированием, если имя файла содержало "," или \

Perl (по некоторым причинам) всегда возвращает 0, если невыход с явным значением, что мне кажется странным. Так как в этом случае я проверяю ошибки в скрипте и возвращаю ненулевое значение в этом случае.

3 голосов
/ 28 сентября 2010

Чтобы ответить на ваш вопрос, вы хотите, чтобы perl равнялся exit 1 за неудачу и exit 0 за успех.При этом, вы делаете это неправильно.В самом деле.Кроме того, не анализируйте вывод ls.Вы будете вызывать много головных болей.

for file in *; do
    if [[ $file = *bl[eau]h ]]; then 
        echo "$file matches"
    fi
done
1 голос
/ 28 сентября 2010

Хороший вопрос, мой совет: будьте проще и используйте Posix (избегайте Bashisms 1 ), где это возможно ..

so ross$ if perl -e 'exit 0'; then echo Good; else echo Bad; fi
Good
so ross$ if perl -e 'exit 1'; then echo Good; else echo Bad; fi
Bad

1.Конечно, OP был помечен bash , но другие могут захотеть узнать форму универсального Posix.

1 голос
/ 28 сентября 2010

Возвращаемое значение предыдущей команды сохраняется в переменной bash $?.Вы можете сделать что-то вроде:

perl someargs script.pl more args
if [ $? == 0 ] ; then
    echo true
else
    echo false
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...