次のセクションがまもなく開始されることを知らせるために、いくつかの設定スクリプトで使用できる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移植可能なコードの唯一の例外は、local
POSIX専用ではないユーティリティを使用していることですが、ほとんどどこでも使用されます。シミュレーションのために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
..たとえば、ハッシュ#
のみが印刷され、その後に\n
ewlineが印刷されます。ただし、最初のパラメータの後にパラメータを追加することは役に立ちません_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