tech:script_bash_fonctions_envrac
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tech:script_bash_fonctions_envrac [2026/05/13 22:40] – Jean-Baptiste | tech:script_bash_fonctions_envrac [2026/06/30 21:52] (Version actuelle) – Jean-Baptiste | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | < | ||
| + | {{tag> | ||
| + | |||
| + | # Script bash fonctions en vrac | ||
| + | |||
| + | Voir [[notes_hexa|Fonctions conversion Hexa ASCII]] | ||
| + | |||
| + | Fonctions récupérées de http:// | ||
| + | |||
| + | ~~~bash | ||
| + | #! /bin/bash | ||
| + | |||
| + | set -euo pipefail | ||
| + | IFS=$' \t\n' | ||
| + | export LC_ALL=C | ||
| + | |||
| + | SCRIPT_NAME=$(basename " | ||
| + | readonly SCRIPT_NAME | ||
| + | SCRIPT_DIR=$(readlink -m " | ||
| + | readonly SCRIPT_DIR | ||
| + | |||
| + | # Launch this script as root | ||
| + | if [ $EUID != 0 ]; then | ||
| + | sudo " | ||
| + | exit $? | ||
| + | fi | ||
| + | |||
| + | [ -r / | ||
| + | |||
| + | # check if command exists | ||
| + | command_exists() { type $1 > /dev/null 2>& | ||
| + | |||
| + | command_exists() { | ||
| + | command -v " | ||
| + | echo "I require $1 but it's not installed. Aborting." | ||
| + | exit 127 | ||
| + | ) | ||
| + | } | ||
| + | |||
| + | for COMMAND in " | ||
| + | do | ||
| + | command_exists " | ||
| + | done | ||
| + | |||
| + | |||
| + | exit_si_erreur(){ | ||
| + | if [ $1 != 0 ] | ||
| + | then | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # plop ; exit_si_erreur $? | ||
| + | |||
| + | get_mountpoint() { df -l --output=target " | ||
| + | |||
| + | |||
| + | # check if directory is empty | ||
| + | dir_is_empty() { | ||
| + | if [ -z "$(ls -A $1)" ] | ||
| + | then | ||
| + | return 0 | ||
| + | else | ||
| + | return 1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | isNonEmptyStr() { echo " | ||
| + | |||
| + | is_empty_var() { | ||
| + | local var | ||
| + | var=$1 | ||
| + | if [[ " | ||
| + | } | ||
| + | |||
| + | is_valid_value_var() { | ||
| + | # Syntax exemple : | ||
| + | # is_valid_value_var BOOL y n && echo "VAR ' | ||
| + | # is_valid_value_var NUM 1 2 3 || echo "VAR ' | ||
| + | local var=$1 | ||
| + | shift | ||
| + | for value in " | ||
| + | do | ||
| + | if [ " | ||
| + | then | ||
| + | return 0 # TRUE | ||
| + | fi | ||
| + | done | ||
| + | return 1 # FALSE | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | isDevMounted() { findmnt --source " | ||
| + | isPathMounted() { findmnt --target " | ||
| + | isMounted() { findmnt | ||
| + | is_mount() { findmnt -M " | ||
| + | # Voir aussi la commande " | ||
| + | |||
| + | # check user privileges | ||
| + | root_privs() { | ||
| + | if [ " | ||
| + | then | ||
| + | return 0 | ||
| + | else | ||
| + | return 1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Require that this runs as root. | ||
| + | [ " | ||
| + | |||
| + | # check if input is numeric | ||
| + | isNumeric() { echo " | ||
| + | |||
| + | # check if input is a string | ||
| + | isString() { echo " | ||
| + | |||
| + | # check if file exist | ||
| + | file_exist() { | ||
| + | if [ $# -ne 1 ] | ||
| + | then | ||
| + | echo " | ||
| + | exit 2 | ||
| + | fi | ||
| + | [ -e " | ||
| + | } | ||
| + | |||
| + | # | ||
| + | return_only_files_exists() { ls -1 " | ||
| + | |||
| + | |||
| + | if !(isString " | ||
| + | then | ||
| + | printf " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if ! command -v zgrep &> /dev/null | ||
| + | then | ||
| + | zgrep() { | ||
| + | zcat " | ||
| + | } | ||
| + | fi | ||
| + | |||
| + | check_device() { | ||
| + | if [ -c " | ||
| + | then | ||
| + | wrap_good " | ||
| + | else | ||
| + | wrap_bad " | ||
| + | EXITCODE=1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | strip_comment() { grep -Ev -e ' | ||
| + | |||
| + | abs() { | ||
| + | local -i VAL=$1 | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | |||
| + | calc_sum() { awk ' | ||
| + | |||
| + | |||
| + | mk_calc() { awk "BEGIN { print $* }"; } | ||
| + | # ex : mk_calc 7.5/3.2 => 2.34375 | ||
| + | # Voir aussi expr : CACHE_USED=$( expr \( $CACHE_USED \* 1024 \) ) | ||
| + | |||
| + | # A helper to make sure that Chrome is linked correctly | ||
| + | function installation_status() { | ||
| + | google-chrome-stable --version > /dev/null 2>&1 | ||
| + | [ $? -eq 0 ] | ||
| + | } | ||
| + | |||
| + | |||
| + | ############ | ||
| + | |||
| + | say() { | ||
| + | printf " | ||
| + | } | ||
| + | |||
| + | # shellcheck disable=SC2317 | ||
| + | confirm() { | ||
| + | while true; do | ||
| + | read -r -p "$1 (y/[n]): " answer | ||
| + | case $answer in | ||
| + | [Yy]* ) return 0; break;; | ||
| + | [Nn]* ) return 1; break;; | ||
| + | "" | ||
| + | * ) echo " | ||
| + | esac | ||
| + | done | ||
| + | } | ||
| + | |||
| + | install_package() { | ||
| + | sudo apt install --no-install-recommends -y " | ||
| + | } | ||
| + | |||
| + | ######### | ||
| + | |||
| + | quote () { | ||
| + | local quoted=${1// | ||
| + | printf "' | ||
| + | } | ||
| + | |||
| + | |||
| + | dequote () { | ||
| + | eval printf %s " | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | `get_dev.sh` | ||
| + | ~~~bash | ||
| + | #! /bin/bash | ||
| + | |||
| + | # Respond to the question : if a new file is created, this will be on which block device ? | ||
| + | # Input arg 1 : path (file) | ||
| + | # Outpout | ||
| + | |||
| + | set -euo pipefail | ||
| + | IFS=$' \t\n' | ||
| + | export LC_ALL=C | ||
| + | |||
| + | NEW_FILE=" | ||
| + | |||
| + | is_regular_file() { | ||
| + | [[ -f $1 ]] | ||
| + | } | ||
| + | |||
| + | # check if directory exists | ||
| + | is_dir() { | ||
| + | [[ -d $1 ]] | ||
| + | } | ||
| + | |||
| + | get_parent_dir() { | ||
| + | local CHEMIN=" | ||
| + | while ! " | ||
| + | do | ||
| + | CHEMIN=$(dirname " | ||
| + | done | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | get_device() { df -lP " | ||
| + | |||
| + | get_device " | ||
| + | ~~~ | ||
| + | |||
| + | A la place de | ||
| + | ~~~bash | ||
| + | dir_exists /tmp/plop || mkdir -p /tmp/plop | ||
| + | ~~~ | ||
| + | |||
| + | Il est préférable de faire d' | ||
| + | ~~~bash | ||
| + | install -d /tmp/plop | ||
| + | ~~~ | ||
| + | |||
| + | Faire une division | ||
| + | ~~~bash | ||
| + | echo $(( 10 / 3 )) | ||
| + | echo $(( VAR / 3 )) | ||
| + | expr 10 / 3 | ||
| + | |||
| + | calc() { awk "BEGIN { print "" | ||
| + | |||
| + | ~~~ | ||
| + | |||
| + | ~~~bash | ||
| + | my_command || { echo ' | ||
| + | ~~~ | ||
| + | |||
| + | Bash Colors \ | ||
| + | source : https:// | ||
| + | ~~~bash | ||
| + | color() { | ||
| + | local codes=() | ||
| + | if [ " | ||
| + | codes=( " | ||
| + | shift | ||
| + | fi | ||
| + | if [ " | ||
| + | local code= | ||
| + | case " | ||
| + | # see https:// | ||
| + | black) code=30 ;; | ||
| + | red) code=31 ;; | ||
| + | green) code=32 ;; | ||
| + | yellow) code=33 ;; | ||
| + | blue) code=34 ;; | ||
| + | magenta) code=35 ;; | ||
| + | cyan) code=36 ;; | ||
| + | white) code=37 ;; | ||
| + | esac | ||
| + | if [ " | ||
| + | codes=( " | ||
| + | fi | ||
| + | fi | ||
| + | local IFS=';' | ||
| + | echo -en ' | ||
| + | } | ||
| + | |||
| + | wrap_color() { | ||
| + | text=" | ||
| + | shift | ||
| + | color " | ||
| + | echo -n " | ||
| + | color reset | ||
| + | echo | ||
| + | } | ||
| + | |||
| + | wrap_good() { echo " | ||
| + | |||
| + | wrap_bad() { echo " | ||
| + | |||
| + | wrap_warning() { wrap_color >&2 " | ||
| + | |||
| + | error() { printf " | ||
| + | |||
| + | failure() { | ||
| + | local rc=$? | ||
| + | echo -e " | ||
| + | return $rc | ||
| + | } | ||
| + | |||
| + | success() { | ||
| + | echo -e " | ||
| + | return 0 | ||
| + | } | ||
| + | |||
| + | # Getpass | ||
| + | read -s password | ||
| + | read -s -p " | ||
| + | |||
| + | get_free_space() { | ||
| + | local chemin=$1 | ||
| + | local -i free_mb | ||
| + | free_mb=" | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | check_free_space() { | ||
| + | # check_free_space /tmp/ 200 | ||
| + | # will exit if /tmp/ less than 200MB | ||
| + | local chemin=$1 | ||
| + | local -i min_free_mb=$2 | ||
| + | if [[ " | ||
| + | then | ||
| + | echo ERROR: No space left on device >&2 | ||
| + | exit 28 | ||
| + | fi | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | Appelle d'une fonction bash depuis un autre shell \ | ||
| + | Même UID pour deux utilisateurs différents | ||
| + | ~~~bash | ||
| + | cat <<EOF | bash -s -- | ||
| + | same_uid_for_Utilisateur_and_utilisateur() | ||
| + | { | ||
| + | local -i RET=0 | ||
| + | local -i UID_Utilisateur=$(id -u Utilisateur) | ||
| + | RET=$(( RET + $? )) | ||
| + | local -i UID_utilisateur=$(id -u utilisateur) | ||
| + | RET=$(( RET + $? )) | ||
| + | | ||
| + | if [[ (RET -eq 0) && (UID_Utilisateur -ne UID_utilisateur) ]] | ||
| + | then | ||
| + | echo " | ||
| + | chown -R utilisateur: | ||
| + | usermod -o -u $(id -u utilisateur) -g $(id -g utilisateur) Utilisateur | ||
| + | fi | ||
| + | |||
| + | exit | ||
| + | } | ||
| + | |||
| + | same_uid_for_Utilisateur_and_utilisateur | ||
| + | EOF | ||
| + | ~~~ | ||
| + | |||
| + | Variables | ||
| + | ~~~bash | ||
| + | SCRIPTPATH=$(dirname " | ||
| + | |||
| + | ~~~ | ||
| + | |||
| + | |||
| + | http:// | ||
| + | |||
| + | Si la commande `waitpid` n'est pas présente (util-linux-extra) | ||
| + | |||
| + | ~~~bash | ||
| + | waitpid() | ||
| + | { | ||
| + | while ps -p $1 >/ | ||
| + | do | ||
| + | sleep 5 | ||
| + | done | ||
| + | shift | ||
| + | " | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | Strip char / trim => utiliser `xargs` ex : | ||
| + | ~~~bash | ||
| + | load5=$(echo $UPTIME | awk -F, ' | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Gestion des logs | ||
| + | |||
| + | ~~~bash | ||
| + | #!/bin/bash | ||
| + | NAME=plop | ||
| + | LOG=/ | ||
| + | |||
| + | exec >> | ||
| + | exec &> >(tee -i / | ||
| + | |||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Gestion des erreurs | ||
| + | |||
| + | ~~~bash | ||
| + | #! /bin/bash | ||
| + | |||
| + | # to combine `set -e` (same as: `set -o errexit`) with an ERR trap | ||
| + | set -eE # same as: `set -o errexit -o errtrace` | ||
| + | |||
| + | err_report() | ||
| + | { | ||
| + | echo "Error on line $1" | ||
| + | } | ||
| + | |||
| + | trap ' | ||
| + | |||
| + | echo hello | grep foo # This is line number 9 | ||
| + | ~~~ | ||
| + | |||
| + | Source : https:// | ||
| + | |||
| + | |||
| + | ## Exécution à la sortie | ||
| + | |||
| + | ~~~bash | ||
| + | trap 'rm -f " | ||
| + | ~~~ | ||
| + | |||
| + | ou encore | ||
| + | ~~~bash | ||
| + | trap '[ " | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## No sigterm terminate | ||
| + | |||
| + | ~~~bash | ||
| + | #!/bin/bash | ||
| + | trap '' | ||
| + | |||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Utilisation d' | ||
| + | |||
| + | ~~~bash | ||
| + | shopt -s expand_aliases | ||
| + | source ~/ | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | |||
| + | ## Autres | ||
| + | |||
| + | How to make sure only one instance of a bash script runs ? | ||
| + | ~~~bash | ||
| + | if [ $(pidof -x $0| wc -w) -gt 2 ]; then | ||
| + | echo "More than 1" | ||
| + | exit | ||
| + | fi | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | Note : [[https:// | ||
| + | ~~~bash | ||
| + | true | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ~~~bash | ||
| + | # We use this to print to the terminal when the context | ||
| + | # of STDOUT is something other than the pty. | ||
| + | declare -r TTY=" | ||
| + | |||
| + | printf $'%s %s\n' " | ||
| + | printf $' | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Bash variable Substitution | ||
| + | |||
| + | Supprimer une extention de fichier | ||
| + | ~~~ | ||
| + | $ VAR=" | ||
| + | $ echo ${VAR%.txt} | ||
| + | plop | ||
| + | ~~~ | ||
| + | |||
| + | ~~~ | ||
| + | $ var=sd_feeef_efe_g | ||
| + | $ echo " | ||
| + | feeef_efe_g | ||
| + | ~~~ | ||
| + | |||
| + | ~~~ | ||
| + | $ var=toto-tt-ll | ||
| + | $ echo " | ||
| + | toto_tt_ll | ||
| + | ~~~ | ||
| + | |||
| + | ~~~ | ||
| + | $ echo " | ||
| + | toto_tt-ll | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | Case upper lower majuscule minuscule | ||
| + | ~~~bash | ||
| + | x=" | ||
| + | echo $x # HELLO | ||
| + | |||
| + | y=${x,,} | ||
| + | echo $y # hello | ||
| + | |||
| + | z=${y^^} | ||
| + | echo $z # HELLO | ||
| + | ~~~ | ||
| + | |||
| + | Dernier caractère d'une chaine | ||
| + | ~~~bash | ||
| + | echo " | ||
| + | |||
| + | # ou | ||
| + | |||
| + | echo ${str:0-1} | ||
| + | ~~~ | ||
| + | |||
| + | Renommer en supprimant un prefix | ||
| + | ~~~bash | ||
| + | for fic in *.j2 ; do mv " | ||
| + | ~~~ | ||
| + | |||
| + | ----------- | ||
| + | |||
| + | ~~~bash | ||
| + | #!/bin/bash | ||
| + | SCRIPT_PATH=" | ||
| + | |||
| + | ${SCRIPT_PATH}/ | ||
| + | ~~~ | ||
| + | |||
| + | ----- | ||
| + | |||
| + | ~~~bash | ||
| + | negate() { | ||
| + | if [[ $# -eq 0 ]]; then | ||
| + | echo " | ||
| + | return 38 | ||
| + | else | ||
| + | # ! " | ||
| + | " | ||
| + | fi | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | ~~~ | ||
| + | $ negate true ; echo $? | ||
| + | 1 | ||
| + | |||
| + | $ negate false ; echo $? | ||
| + | 0 | ||
| + | |||
| + | $ true | negate ; echo $? | ||
| + | ERROR. ENOSYS Function not implemented | ||
| + | 38 | ||
| + | |||
| + | $ false | negate ; echo $? | ||
| + | ERROR. ENOSYS Function not implemented | ||
| + | 38 | ||
| + | ~~~ | ||
| + | |||
| + | Voir aussi : | ||
| + | * PIPESTATUS | ||
| + | * pipefail | ||
| + | |||
