我对脚本编写并不十分熟悉,但我正在努力学习。我遇到了一个脚本,我需要用它来检查Xcode中的构建过程。如果此find操作返回结果,我需要'退出1'。或者停止构建。
TAGS="TODO:|FIXME:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 |
xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" |
perl -p -e "s/($TAGS)/ error: \$1/"
那么,如果我找到了什么可以退出,但如果不找到则可以退出?
答案 0 :(得分:1)
默认情况下,管道的退出状态是管道中最后一个命令的状态。因此,如果{1}}进程打印任何内容,则希望perl
进程以1退出,如果不打印,则退出为0。
perl -p -e "\$match = 1 if s/($TAGS)/ error: \$1/; END { exit \$match; }"
注意:在error
之前添加了空格。
测试:
$ cat so15307298.sh
TAGS="TODO:|FIXME:"
SRCROOT=.
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 |
xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" |
perl -p -e "\$match = 1 if s/($TAGS)/ error: \$1/; END { exit \$match; }"
$ echo "TODO: this is a problem" > x1.h
$ echo "FIXME: this is a problem too" > x2.h
$ echo "Allez oop" > x3.h
$ sh -x so15307298.sh
+ TAGS='TODO:|FIXME:'
+ SRCROOT=.
+ find . '(' -name '*.h' -or -name '*.m' ')' -print0
+ xargs -0 egrep --with-filename --line-number --only-matching '(TODO:|FIXME:).*$'
+ perl -p -e '$match = 1 if s/(TODO:|FIXME:)/error: $1/; END { exit $match; }'
./x1.h:1: error: TODO: this is a problem
./x2.h:1: error: FIXME: this is a problem too
$
答案 1 :(得分:0)
FILES=$(find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0)
if [ "x$FILES" == "x" ]; then
exit 1
fi