在bash中的命令管道序列中执行条件命令

时间:2012-03-23 20:24:07

标签: linux bash shell pipe conditional-execution

抱歉崎岖的主题名称(如果您在查看问题后找到更合适的标题,请随时编辑)。 代码示例等于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 ”或不使用。我认为conditdonal别名可以完成这项工作,就像我习惯使用shell一样,但它们在脚本中不起作用。

我可能会陷入困境,但我担心多次评估会对绩效产生影响。

任何使代码“更优雅”的方法?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

具有完全相同的效果。

答案 1 :(得分: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"' \;

答案 2 :(得分: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