Duplicação de código em um script de shell

2

Meu script bash (vamos chamá-lo de myscript ) recebe entrada de stdin (pipe) ou forma um arquivo regular (se filename foi fornecido como argumento)

a) someprog | myscript

   or

b) myscript file.txt

Em seguida, os dados são processados linha por linha. No momento, meu código é parecido com o seguinte:

if [ -t 0 ] ; then
    while read LINE
      do
         prog_1
         prog_2
         ...
         prog_n
      done
else
    while read LINE
      do
         prog_1
         prog_2
         ...
         prog_n
      done < $1
fi

Este script funciona bem, mas parece haver muita duplicidade. Eu estou querendo saber se existe uma maneira melhor (mais elegante) de fazê-lo. Todas as etapas 1 to n são iguais. A única diferença é se existe um < $1 no final ou não. não há melhor maneira de fazer isso?

    
por Martin Vegter 05.01.2014 / 00:05

3 respostas

5

Funções são a maneira geral de reduzir a duplicação de código. Este caso não é diferente. Você só precisa definir uma função para implementar sua lógica while read .

myfunc() {
    while read LINE
    do
        prog_1
        prog_2
        ...
        prog_n
    done
}

if [[ -t 0 ]]; then
    myfunc # read stdin passed to the script
else
    myfunc < "$1" # redirect file to stdin
fi
    
por 05.01.2014 / 02:01
2

Eu costumo usar

cat "$@" | while read line ; do
    ...
done

O único problema pode ser que alguém chame someprog | myscript file.txt (mas o mesmo problema existe no código original).

    
por 05.01.2014 / 00:18
1

Se um argumento for dado, redirecione o stdin dele e reutilize o código.

if [ -t 0 ]; then
    exec 3<&0
elif (( $# > 0 )) && [[ -r $1 ]]; then
    exec 3<"$1"
else
    echo no stdin and no file to read
    exit 1
fi

while IFS= read -r -u 3 LINE; do
     prog_1
     prog_2
     ...
     prog_n
done

exec 3<&-
    
por 05.01.2014 / 13:58