0

很抱歉主题名称颠簸(如果您在查看问题后发现更合适的标题,请随时编辑)。代码示例等于 1000 个单词,所以我们开始:

if [ "$REGEX" != "" ]; then
        find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |                                  
        grep -E $REGEX |
        awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
        while read -r line; do mv -f $line; done 
else
        find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
        awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
        while read -r line; do mv -f $line; done
fi

代码所做的并不是那么重要,我只想找到更优雅的方式来使用“ grep -E $REGEX ”或不使用。我认为条件别名可以像我习惯使用 shell 一样完成这项工作,但它们在脚本中不起作用。

我可以设置一个条件,但我担心多次评估会影响性能。

有什么方法可以让代码“更优雅”?

4

3 回答 3

1

一个非常简单的解决方案是:

test -n "$REGEX" && cmd="grep -E $REGEX"
find ... | ${cmd-cat} | awk ...

如果定义了 cmd,则在管道中使用它。否则,使用 cat 执行无操作。你也可以这样做:

find ... |
if test -n "$REGEX"; then
  grep -E $REGEX
else
  cat
fi |
awk ...

具有完全相同的效果。

于 2012-03-23T20:31:36.113 回答
1

一种简单的方法是使用^(始终匹配:它意味着“行首”,每行都有)如果$REGEX未设置或空白:

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
grep -E ${REGEX:-^} |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done

就此而言,您可以将其合并到原始文件中find

find $TEST_DIR -type f -regextype posix-extended \
     -regex '^.*(status|stderr|stdout)-captured$' \
     -regex ".*${REGEX}.*" |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done

就此而言,您也可以将脚本的所有其余部分合并到find

find $TEST_DIR -type f -regextype posix-extended \
     -regex '^.*(status|stderr|stdout)-captured$' \
     -regex ".*${REGEX}.*" \
     -exec bash -c 'file="{}" ; mv -f "$file" "${file%-captured}-expected"' \;
于 2012-03-23T20:33:09.260 回答
0

这是一个略显丑陋但通用的解决方案。

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' \
 | if [ "$REGEX" != "" ]; then
        grep -E $REGEX; \
   else \
        cat; \
   fi \
 | awk '{print(""$1" "$1)}' \
 | sed 's/-captured$/-expected/' \
 | while read -r line; do mv -f $line; done 
于 2012-03-23T20:35:05.047 回答