Условное выполнение команд в конвейерной последовательности команд в bash - PullRequest
0 голосов
/ 24 марта 2012

Извините за ухабистое название темы (не стесняйтесь редактировать, если вы найдете более подходящее название после просмотра проблемы). Пример кода равен 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 могут выполнять эту работу так же, как я привык к использованию оболочки, но они не работают внутри скриптов.

Я мог бы поставить условие, но боюсь влияния производительности на результаты нескольких оценок.

Есть ли способ сделать код "более элегантным"?

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Один простой способ - использовать ^ (что всегда соответствует: это означает «начало строки», которое есть в каждой строке), если $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"' \;
1 голос
/ 24 марта 2012

Очень простое решение:

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

Если cmd определен, он используется в конвейере. В противном случае, кошка используется, выполняя no-op. Вы также можете сделать:

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

с точно таким же эффектом.

0 голосов
/ 24 марта 2012

Вот немного некрасивое, но общее решение.

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 
...