如何测试嵌入在bash脚本中的perl命令是否返回true?

时间:2010-09-28 17:57:51

标签: perl bash

所以,我有一个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 个答案:

答案 0 :(得分:8)

如果您使用exit,则可以直接使用if。 E.g。

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

0表示成功,非零表示失败,如果不调用exit,则默认值为0。

答案 1 :(得分:3)

要回答您的问题,您希望perl exit 1失败,exit 0取得成功。话虽这么说,你这样做是错误的。真。另外,不要解析ls的输出。你会让自己感到很头疼。

for file in *; do
    if [[ $file = *bl[eau]h ]]; then 
        echo "$file matches"
    fi
done

答案 2 :(得分:3)

for file in * ; do
    perl -e "shift =~ /^.*(bleh|blah|bluh)/ || exit 1" "$file" && echo $file: true
done

你永远不应该解析ls的输出。至少,您将遇到包含空格的文件名的问题。另外,为什么你的shell可以独立运行呢?

传递给perl脚本时引用$ file可以避免文件名(和其他特殊字符)中的空格问题。在内部我避免扩展bash $ file变量,以便在文件名包含“,”或\

时不会引发引用问题

Perl似乎(出于某种原因)总是返回0,如果你没有使用显式值退出,这对我来说似乎很奇怪。因为在这种情况下,我在脚本中测试失败并在这种情况下返回非零值。

答案 3 :(得分:1)

上一个命令的返回值存储在bash变量$?中。你可以这样做:

perl someargs script.pl more args
if [ $? == 0 ] ; then
    echo true
else
    echo false
fi

答案 4 :(得分:1)

这是一个很好的问题,我的建议是:保持简单,尽可能去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形式。