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 に答える