Como posso acrescentar um comando?

0

Não me lembro como acrescentar um comando a um script de shell. Eu procurei por append , add , concat e muito mais sem sucesso. Meu google-fu não ajuda hoje.

Basicamente eu tenho

belly = tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))

if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
else
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat -n
fi

e funciona bem, mas não gosto da lógica duplicada. Eu sei que eu poderia usar uma função ou eval, mas existe uma maneira mais simples de fazer isso? Na minha cabeça eu tenho algo assim:

belly = tail -n +$HEAD $1 | head -n $((TAIL-HEAD+1))

if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
    belly
else
    belly | cat -n
fi

Mas isso não funciona. O que estou perdendo?

    
por aloisdg 26.03.2017 / 13:48

3 respostas

1

Na verdade, isso pode ter sido respondido aqui: Canal condicional

Essa resposta pega o shell if/then/else mechanic e o usa para incorporar a lógica dentro do pipeline. Você pode fazer isso também com o operador && , mas não é tão limpo de ler, então prefiro if .

Basicamente, no seu caso, a linha tail seria assim (observe também a alteração de -z to -n ):

tail -n +"$HEAD" "$1" |
head -n $((TAIL-HEAD+1)) |
if [ -n "${NUMBER+x}" ]; then cat -n; else cat; fi

(isso pode ter alguns erros, eu não estou tão interessado em programação shell Linux. Mas você entendeu.)

    
por 26.03.2017 / 13:59
1

Uma opção seria definir uma variável para gerenciar a parte de alteração do pipeline. Se a única parte que muda é um parâmetro de linha de comando, a implementação é simples:

cat_arg=""
if [ -n "${NUMBER+x}" ]; then
    cat_arg="-n"
fi    
somepipeline ... | cat $cat_arg

Apesar disso, é difícil remover completamente a última parte do pipeline, então usaremos um gato inutilmente, mas isso provavelmente não importará muito. Além disso, isso depende de não citar a variável, o que torna impossível o uso de espaço em branco ou caracteres glob dentro dos argumentos alterados.

Então, uma matriz seria melhor:

final=(cat) 
if [ -n "${NUMBER+x}" ]; then
    final=(cat -n)
fi    
somepipeline ... | "${final[@]}" 

Ou você pode criar duas funções e chamar uma através de uma variável.

Aliás, uma função shell também é a resposta para sua outra pergunta.

# define the function
belly() {
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
}
if ... ; then
    belly "$1" | this
else 
    belly "$1" | that
fi

Você precisa transmitir $1 explicitamente, pois as funções têm seu próprio contexto de parâmetros posicionais.

    
por 26.03.2017 / 14:34
1

Essencialmente, o que você quer realizar é passar ou não passar a opção -n para cat , dependendo do estado de $NUMBER

Basta fazer isso:

tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat ${NUMBER:+'-n'}

Também podemos acabar com o cenário do UUOC:

eval "tail -n +\"$HEAD\" \"\\" | head -n \$((TAIL-HEAD+1)) ${NUMBER:+|cat -n}"
    
por 26.03.2017 / 14:23