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別の断線関数を作成することもできますが、これが必須かどうか疑問です。

2つのシェル機能:

#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

関連情報