mysqlイメージ(Dockerfiile)で学んだシェルのログ関数

ログ関数

シェルを書く機会がないんだけども今後はこれを使ってみようかしら。

mysql_log() {
        local type="$1"; shift
        # accept argument string or stdin
        local text="$*"; if [ "$#" -eq 0 ]; then text="$(cat)"; fi
        local dt; dt="$(date --rfc-3339=seconds)" 
        printf '%s [%s] [Entrypoint]: %s\n' "$dt" "$type" "$text" 
}
mysql_note() {
        mysql_log Note "$@" 
}
mysql_warn() {
        mysql_log Warn "$@" >&2
}
mysql_error() {
        mysql_log ERROR "$@" >&2
        exit 1
}

シェルの冒頭にこんな記述が

パイプラインを用いる一文の終了ステータスをどの時点で決定するかを変更するコマンドだ。

  • “set -o pipefail”なら失敗したコマンドの終了ステータスをパイプライン全体の終了ステータスとする。
  • “set +o pipefail”ならパイプライン最後のコマンドの結果が終了ステータスとなる。

ちなみに”-e”オプションはコマンドが失敗した時点でスクリプト全体を即時エラー終了とするモノだ。

加えて”shopt -s nullglob”の意味は、ワイルドカード利用時に名前が一致しない場合にワイルドカード文字列を無効にする、という意味だ。裏を返すと指定していないと”echo a*”と実行しないと実行結果が”a*”となるらしい…。

set -eo pipefail
shopt -s nullglob

引数の再設定

dockerfileでENTRYPOINTに指定された”docker-entrypoint.sh”に記述があった書き方。

dockerfileのCMDに”mysql”コマンドのオプション引数のみ指定されていた場合に、引数を書き換えて”mysqld –option1 –option2 …”といったように書き換えるコマンドだ。この後”exec”コマンドでこのコマンドを実行していた。

set -- mysqld "$@"

"$*"と"$@"の違い

違いは以下の通りだ。

  • “$*”は、引数全体を1文字の文字列として扱う
  • “$@”は、個々の引数として扱う

ちなみに両方ともダブルクオーテーション抜きに指定するのはまた意味が変わってしまうから止めた方がいいみたい。

function callFunc() {
    echo "result: $1"
}

# case 1: "$*"
function asterisk() {
    callFunc "$*"
}
asterisk 'a' 'b' 'c'
# -> "result: a b c"

# case 2: "$@"
function atSign() {
    callFunc "$@"
}
atSign 'a' 'b' 'c'
# -> "result: a"

"${1:0:1}"って?

私は思った、「変数が指定されてないじゃないか!変数がないのに何を展開・処理しているんだ!?」と。

実はこれ第一引数、つまり”$1″を処理している。
後は分かるだろう。”${variable:0:1}”と同じ処理だ。一番最初の文字を抽出しているのだ。

結論としては、「第一引数の最初の文字を抽出」をしている。

コメントを残す