2

我对脚本不是很熟悉,但我正在努力学习。我遇到了一个脚本,我需要使用它来检查 Xcode 中的构建过程。如果此查找操作返回结果,我需要“退出 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/" 

那么,如果我找到了一些东西,但如果我没有找到,我该怎么做才能退出?

4

2 回答 2

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
$
于 2013-03-09T05:23:03.313 回答
0
FILES=$(find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0)
if [ "x$FILES" == "x" ]; then
  exit 1
fi
于 2013-03-09T05:18:46.113 回答