Função de cabeçalho com número crescente no bash

3

Eu gostaria de ter uma função no bash que eu possa usar em alguns scripts de instalação para anunciar que o próximo parágrafo está sendo iniciado.

Uma solução simples (com cores) seria

headline(){
  echo -e "\e[1;34m###########################################"
  echo -e "##########  \e[1;37m$*"
  echo -e "\e[1;34m###########################################\e[0m"
}

Mas como adiciono um número crescente?

    
por rubo77 28.05.2014 / 11:45

2 respostas

3

Isso é o que você quer, certo?

#!/bin/bash
function headline(){
  echo -e "\e[1;34m###########################################"
  echo -e "#####  Starting paragraph: $1.$2  #####\e[1;37m"
  echo -e "\e[1;34m###########################################\e[0m"
  number=$(($1 + 1))
}
number=1
headline $number "hello"
sleep 1
headline $number "hi everybody"
sleep 1
headline $number "goodnight"

#OUTPUT:
###########################################
#####  Starting paragraph: 1.hello  #####
###########################################
###########################################
#####  Starting paragraph: 2.hi everybody  #####
###########################################
###########################################
#####  Starting paragraph: 3.goodnight  #####
###########################################
    
por 28.05.2014 / 13:27
2

Se houver algo em que o shell é muito bom, isso está atrapalhando os argumentos. E é assim que deve ser - o objetivo principal da shell é interpretar e transmitir esses argumentos.

O que se segue é composto de quase inteiramente de shell builtins - exceto tr e possivelmente printf - e é muito próximo POSIX portable código com a única exceção sendo meu uso de local que não é um utilitário POSIX especificado, mas que é praticamente onipresente. Para emular local , poderíamos fazer mais uma função de uma linha, mas duvido que seja necessário.

DUAS FUNÇÕES DE SHELL:

#let printf handle the printing
_hashes() { printf %0$((${1}))d\n | tr 0 \# ; }

_hdr_inc() { local _hinc=${1##*-} _hashc=${2##*[!0-9]}
    : ${_hinc:=$(set -- $3 ; printf %s_cnt\n "${1-_hdr}")}
    ${1+shift} ${2+2}
    _hashes ${_hashc:=40}
    printf "%s #$((${_hinc}=${_hinc}+1)):${1+%b}" \
        ${1+"$*"} ${1+\c}Default
    echo && _hashes $_hashc
}

Ambas as funções aceitarão qualquer número de argumentos da linha de comando graciosamente (dentro dos limites de $ ARGMAX) .

_hashes

.. por exemplo, você imprimirá apenas um único # hash e um \n ewline. Mas adicionar argumentos após o primeiro é inútil - _hashes() irá ignorá-los.

_hdr_inc - - and a bunch of extras

... por outro lado, será incrementado em um por seu valor atual ou por zero, por uma variável de shell chamada $and_cnt e impressa em seu resultado stdout the 3 string de aproximadamente:

_hashes 40
echo and a bunch of extras \#$((and_cnt=and_cnt+1)):
_hashes 40

Apenas ...

_hdr_inc

... é semelhante, mas com todos os valores padrão:

_hashes 40
echo Default \#$((_hdr_cnt=_hdr_cnt+1)):
_hashes 40

Mas definindo valores explícitos para todos os argumentos:

_hdr_inc counter 31 Some string

... faz ...

_hashes 31
echo Some string \#$((counter=counter+1)):
_hashes 31

Ou apenas o primeiro:

_hdr_inc counter

... faz ...

_hashes 40
echo Default \#$((counter=counter+1))
_hashes 40

DEMO

(   set -- Header Paragraph
    for h do {
        _hdr_inc ; echo
        _hdr_inc - - $h ; echo
        _hdr_inc - 20 $h And More\! ; echo
        _hdr_inc - 30 ; echo
        _hdr_inc $h - ; echo
    } ; done
    set -- $1 $1 $1 $1 $2 $2 $2 $2
    printf 'echo "Custom increment \$%s_cnt = $%s_cnt"
        echo "Explicit increment \$%s = $%s"\n' "$@" |
        . /dev/stdin
    echo 'Default increment $_hdr_cnt =' $_hdr_cnt
)

OUTPUT:

########################################
Default #1:
########################################

########################################
Header #1:
########################################

####################
Header And More! #2:
####################

##############################
Default #2:
##############################

########################################
Default #1:
########################################

########################################
Default #3:
########################################

########################################
Paragraph #1:
########################################

####################
Paragraph And More! #2:
####################

##############################
Default #4:
##############################

########################################
Default #1:
########################################

Custom increment $Header_cnt = 2
Explicit increment $Header = 1
Custom increment $Paragraph_cnt = 2
Explicit increment $Paragraph = 1
Default increment $_hdr_cnt = 4
    
por 28.05.2014 / 23:52