所以,我有一个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输出设置为一个变量然后测试那个变量值,但是如果可能的话我宁愿避免使用那个额外的变量。似乎很浪费。
答案 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形式。