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