我想在 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
..例如,将仅打印一个#
散列,然后打印一条\n
ewline。但是在第一个参数之后添加任何参数都是徒劳的 -_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