Vous n'êtes pas identifié(e).

#1 Le 23/05/2023, à 08:50

P'skhal
Explorateur
Lieu : Au-delà du portail
Inscription : Le 18/08/2016,
Messages : 37 104

Un modèle pour démarrer un script shell

Simon Vieille a écrit :

J'ai régulièrement le besoin d'écrire des scripts shell un peu évolués. Il y a quelques mois, j'ai commencé à travailler sur un modèle que je met régulièrement à jour. Aujourd'hui, j'ai travaillé sur la couche pour gérer les logs et c'est pourquoi j'écris cet article.

JavaScript error: SecurityError: The operation is insecure. (https://umami.deblan.org/umami.js @ 1:0). Open browser console to see more details.
97 lignes
1.6 KiB
Bash
#!/bin/sh

set -eu

usage() {
  printf "Usage: %s [-l DEBUG_LEVEL] [-h]\n" "$0"
}

help() {
    cat << EOH
 SYNOPSIS
    $0 [-l DEBUG_LEVEL] [-h]

 DESCRIPTION

    $0 does things!

 OPTIONS

    -h    Show this help

    -l debug|info|notice|warning|error
          Debug level
EOH
}

on_interrupt() {
  log -l notice ""
  log -l notice "Process aborted!"

  exit 130
}

main() {
  while getopts "l:h" option; do
    case "${option}" in
      h) help; exit 0;;
      l) LOG_VERBOSE="$OPTARG";;
      ?) log -l error "$(usage)"; exit 1;;
    esac
  done

  # log [-t] [-l debug|info|notice|warning|error] message

  exit 0
}

log() {
  LOG_VERBOSE="${LOG_VERBOSE:-info}"
  LEVEL=info
  TIME=

  while getopts "tl:" option; do
    case "${option}" in
      l) LEVEL="$OPTARG"; shift $((OPTIND-1));;
      t) TIME="$(printf "[%s] " "$(date +'%Y-%m-%dT%H:%M:%S.%s')")"; shift $((OPTIND-1));;
      *) exit 1;;
    esac
  done

  if [ -t 2 ] && [ -z "${NO_COLOR-}" ]; then
    case "${LEVEL}" in
      debug) COLOR="$(tput setaf 3)";;
      notice) COLOR="$(tput setaf 4)";;
      warning) COLOR="$(tput setaf 5)";;
      error) COLOR="$(tput setaf 1)";;
      *) COLOR="$(tput sgr0)";;
    esac
  fi

  case "${LEVEL}" in
    debug) LEVEL=100;;
    notice) LEVEL=250;;
    warning) LEVEL=300;;
    error) LEVEL=400;;
    *) LEVEL=200;;
  esac

  case "${LOG_VERBOSE}" in
    debug) LOG_VERBOSE_VALUE=100;;
    notice) LOG_VERBOSE_VALUE=250;;
    warning) LOG_VERBOSE_VALUE=300;;
    error) LOG_VERBOSE_VALUE=400;;
    *) LOG_VERBOSE_VALUE=200;;
  esac

  if [ $LEVEL -ge $LOG_VERBOSE_VALUE ]; then
    printf "%s\n" "$*" | while IFS='' read -r LINE; do
      printf "%s%s%s\n" "${COLOR:-}" "${TIME:-}" "$LINE" >&2
    done
  fi
}

trap on_interrupt INT

main "$@"
 

Ce modèle contient les fonctions usage et help pour décrire le fonctionnement du programme. La fonction on_interrupt permet de gérer le signal SIGINT quand le programme est interrompu.

La fonction main est la fonction qui contient le code principal du script. Elle contient la gestion des paramètres passés au script. Par défaut, plusieurs y sont déjà intégrés : -l pour définir le niveau de log désiré et -h pour afficher l'aide.

Enfin, il y a la fonction log pour afficher des messages de debug avec différents niveaux de criticité. Cela permet de générer des messages qui seront affichés ou pas selon les besoins. Les messages sont colorés selon le niveau de criticité et ils sont redirigés vers stderr. Il est également possible d'ajouter la date.

La suite sur le DeblanBlog


“ Aujourd'hui plus qu'hier et bien moins que demain „

P'skhal

#1 Le 23/05/2023, à 08:50

Explorateur
Lieu : Au-delà du portail
Inscription : Le 18/08/2016,
Messages : 37 104
Simon Vieille a écrit :

J'ai régulièrement le besoin d'écrire des scripts shell un peu évolués. Il y a quelques mois, j'ai commencé à travailler sur un modèle que je met régulièrement à jour. Aujourd'hui, j'ai travaillé sur la couche pour gérer les logs et c'est pourquoi j'écris cet article.

JavaScript error: SecurityError: The operation is insecure. (https://umami.deblan.org/umami.js @ 1:0). Open browser console to see more details.
97 lignes
1.6 KiB
Bash
#!/bin/sh

set -eu

usage() {
  printf "Usage: %s [-l DEBUG_LEVEL] [-h]\n" "$0"
}

help() {
    cat << EOH
 SYNOPSIS
    $0 [-l DEBUG_LEVEL] [-h]

 DESCRIPTION

    $0 does things!

 OPTIONS

    -h    Show this help

    -l debug|info|notice|warning|error
          Debug level
EOH
}

on_interrupt() {
  log -l notice ""
  log -l notice "Process aborted!"

  exit 130
}

main() {
  while getopts "l:h" option; do
    case "${option}" in
      h) help; exit 0;;
      l) LOG_VERBOSE="$OPTARG";;
      ?) log -l error "$(usage)"; exit 1;;
    esac
  done

  # log [-t] [-l debug|info|notice|warning|error] message

  exit 0
}

log() {
  LOG_VERBOSE="${LOG_VERBOSE:-info}"
  LEVEL=info
  TIME=

  while getopts "tl:" option; do
    case "${option}" in
      l) LEVEL="$OPTARG"; shift $((OPTIND-1));;
      t) TIME="$(printf "[%s] " "$(date +'%Y-%m-%dT%H:%M:%S.%s')")"; shift $((OPTIND-1));;
      *) exit 1;;
    esac
  done

  if [ -t 2 ] && [ -z "${NO_COLOR-}" ]; then
    case "${LEVEL}" in
      debug) COLOR="$(tput setaf 3)";;
      notice) COLOR="$(tput setaf 4)";;
      warning) COLOR="$(tput setaf 5)";;
      error) COLOR="$(tput setaf 1)";;
      *) COLOR="$(tput sgr0)";;
    esac
  fi

  case "${LEVEL}" in
    debug) LEVEL=100;;
    notice) LEVEL=250;;
    warning) LEVEL=300;;
    error) LEVEL=400;;
    *) LEVEL=200;;
  esac

  case "${LOG_VERBOSE}" in
    debug) LOG_VERBOSE_VALUE=100;;
    notice) LOG_VERBOSE_VALUE=250;;
    warning) LOG_VERBOSE_VALUE=300;;
    error) LOG_VERBOSE_VALUE=400;;
    *) LOG_VERBOSE_VALUE=200;;
  esac

  if [ $LEVEL -ge $LOG_VERBOSE_VALUE ]; then
    printf "%s\n" "$*" | while IFS='' read -r LINE; do
      printf "%s%s%s\n" "${COLOR:-}" "${TIME:-}" "$LINE" >&2
    done
  fi
}

trap on_interrupt INT

main "$@"
 

Ce modèle contient les fonctions usage et help pour décrire le fonctionnement du programme. La fonction on_interrupt permet de gérer le signal SIGINT quand le programme est interrompu.

La fonction main est la fonction qui contient le code principal du script. Elle contient la gestion des paramètres passés au script. Par défaut, plusieurs y sont déjà intégrés : -l pour définir le niveau de log désiré et -h pour afficher l'aide.

Enfin, il y a la fonction log pour afficher des messages de debug avec différents niveaux de criticité. Cela permet de générer des messages qui seront affichés ou pas selon les besoins. Les messages sont colorés selon le niveau de criticité et ils sont redirigés vers stderr. Il est également possible d'ajouter la date.

La suite sur le DeblanBlog


“ Aujourd'hui plus qu'hier et bien moins que demain „

Hors ligne

Hors ligne

#2 Le 23/05/2023, à 08:56

M'lou
MétalWoman
Lieu : Quelque part dans la Galaxie
Inscription : Le 18/08/2016,
Messages : 41 500

Re : Un modèle pour démarrer un script shell

cool


L'amour est comme un jardin, il doit se cultiver chaque  jour pour donner le meilleur de lui-même

M'lou

#2 Le 23/05/2023, à 08:56

MétalWoman
Lieu : Quelque part dans la Galaxie
Inscription : Le 18/08/2016,
Messages : 41 500

cool


L'amour est comme un jardin, il doit se cultiver chaque  jour pour donner le meilleur de lui-même

Hors ligne

Hors ligne

#3 Le 23/05/2023, à 08:58

P'skhal
Explorateur
Lieu : Au-delà du portail
Inscription : Le 18/08/2016,
Messages : 37 104

Re : Un modèle pour démarrer un script shell

smile


“ Aujourd'hui plus qu'hier et bien moins que demain „

P'skhal

#3 Le 23/05/2023, à 08:58

Explorateur
Lieu : Au-delà du portail
Inscription : Le 18/08/2016,
Messages : 37 104

smile


“ Aujourd'hui plus qu'hier et bien moins que demain „

Hors ligne

Hors ligne

Pied de page des forums