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

쉘이 잘하는 것이 하나 있다면 매개변수를 파괴하는 것입니다. 이는 당연한 것입니다. 쉘의 주요 목적은 이러한 인수를 해석하고 전달하는 것입니다.

다음 내용으로 구성됩니다.거의tr및 제외하고 완전히 쉘 내장으로 구성됩니다.가능한 printf-그리고아주 근접한POSIX 이식 가능한 코드의 유일한 예외는 localPOSIX 전용이 아닌 유틸리티를 사용하고 있다는 점이지만 거의 모든 곳에 사용됩니다. 시뮬레이션을 위해 local또 다른 단선 함수를 만들 수도 있지만 이것이 꼭 필요한지는 의문입니다.

두 가지 쉘 기능:

#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 또는 0부터 명명된 쉘 변수를 즉시 증가시키고 그 결과를 약 3줄의 실행 문자열로 $and_cnt인쇄합니다 .stdout

_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

관련 정보