bash 中数字递增的标头函数

bash 中数字递增的标头函数

我想在 bash 中有一个函数,我可以在一些安装脚本中使用它来宣布下一段即将开始。

一个简单的解决方案(带颜色)是

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

但是如何在其中添加越来越多的数字呢?

答案1

这就是你想要的,对吗?

#!/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  #####
###########################################

答案2

如果说 shell 有什么擅长的话,那就是破坏参数。这是应该的 - shell 的主要目的是解释和传递这些参数。

以下内容组成几乎完全由 shell 内置函数组成 - 除了tr可能 printf- 并且是非常接近POSIX 可移植代码,唯一的例外是我使用的local不是 POSIX 指定的实用程序,但它几乎无处不在。为了模拟,local我们可能会再做一个单行函数,但我怀疑这是否有必要。

两个 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
}

这两个函数都会优雅地接受任意数量的命令行参数(在 $ARGMAX 限制内)

_hashes

..例如,将仅打印一个#散列,然后打印一条\newline。但是在第一个参数之后添加任何参数都是徒劳的 -_hashes()将忽略它们。

_hdr_inc - - and a bunch of extras

...另一方面,将立即从其当前值增加 1 或从零增加一个名为的 shell 变量$and_cnt,并打印到其stdout大约执行的 3 行字符串结果:

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

只是 ...

_hdr_inc

... 类似,但使用所有默认值:

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

但为所有参数设置显式值:

_hdr_inc counter 31 Some string

...做...

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

或者只是第一个:

_hdr_inc counter

...做...

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

演示版

(   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
)

输出:

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

相关内容