====== Bash ====== ===== Substitution dans les variables ===== * Chercher/remplacer : ''${variable/search_pattern/replacement}'' => remplacer la première occurrence de ''search_pattern'' par ''replacement'' dans de contenu de la variable ''variable''. * Pour chercher explicitement **au début** du contenu de la variable : ''${parameter/#search_pattern/replacement}'' * Pour chercher explicitement **à la fin** du contenu de la variable : ''${parameter/%search_pattern/replacement}'' * Pour remplacer **toutes les occurences** : ''%%${parameter//search_pattern/replacement}%%'' * Mise en **majuscule** (upper case) : ''${variable^}'' => mise en majuscule du première caractère du contenu de la variable ''variable'' * Pour mettre **tout en majuscule** : ''${variable^^}'' * Mise en **minuscule** (lower case) : ''${variable,}'' => mise en minuscule du première caractère du contenu de la variable ''variable'' * Pour mettre **tout en minuscule** : ''${variable,,}'' ===== Array ===== * déclaration : ''array=( 1 2 3 )'' ou ''declare -a array=( 1 2 3 )'' * déclaration d'un tableau associatif : ''declare -A array=( ['key1']='value1' ['key2']='value2' ['key3']='value3' )'' * déclaration d'un tableau en lecture seule : ''declare -Ar ro_array=( [...] )'' ou ''declare -ar ro_array=( [...] )'' * ajouter un élément : ''array+=( 4 )'' * ajouter un élément à un tableau associatif : ''array+=( ['key']='value' )'' * lister tous les éléments d'un tableau (=valeur dans le cas d'un tableau associatif) : ''${array[@]}'' * lister toutes les clés d'un tableau associatif : ''${!array[@]}'' * récupérer le nombre d'élements d'un tableau : ''echo ${#array[@]}'' * construire un tableau à partir d'une chaîne de caractères : Cela dépend du séparateur utilisé : * avec un retour à la ligne : ''%%mapfile -t myarray <<< "$ALL"%%'' * avec un espace (ou autre caractère unique et "simple) : ''%%IFS=" " read -ra myarray <<< "$ALL"%%'' * ajouter des valeurs à un tableau existant : ''%%mapfile -t -O "${#myarray[@)}" myarray <<< "$ALL"%%'' * ajouter depuis un fichier : ''%%mapfile -t myarray < /path/to/file%%'' * ajouter depuis la sortie d'une commande : ''%%mapfile -t myarray < <( grep -vE '^#' /path/to/file | grep -vE '^\s*$' )%%'' * Note : voir la fonction ''explode'' pour une version générique ==== Fonctions utiles ==== === in_array === function in_array() { local needle=$1 el shift for el in "$@"; do [ "$el" = "$needle" ] && return 0 done return 1 } **Utilisation :** array=(1 2 3) in_array 1 ${array[@]} && echo IN in_array 5 ${array[@]} && echo OUT === is_empty === function is_empty() { [ $# -gt 0 ] && return 1 return 0 } **Utilisation :** array=(1 2 3) is_empty $array && echo empty ! is_empty $array && echo not empty === array_filter === function array_filter() { local values=() x=0 v for v in "$@"; do if [[ "$v" == "--" ]]; then x=1 elif [[ $x -eq 0 ]]; then values+=( "$v" ) else mapfile -t values < <( printf '%s\n' "${values[@]}" | grep -Ev "^${v}$" ) fi done printf '%s\n' "${values[@]}" } **Utilisation :** a=(a b c d e) array_filter ${a[@]} -- c e # Output: # a # b # d === array_intersect === function array_intersect() { local result_var=$1 declare -ga "$result_var=()" shift local array1=() local array2=() local switch_to_array2=0 for v in "$@"; do if [ "$v" == "--" ]; then switch_to_array2=1 elif [ $switch_to_array2 -eq 0 ]; then array2+=( "$v" ) else array1+=( "$v" ) fi done for i in "${array1[@]}"; do for j in "${array2[@]}"; do if [[ $i == $j ]]; then declare -ga "$result_var+=( \"$i\" )" break fi done done } **Utilisation :** a=(a b c d e) b=(c d) array_intersect c "${a[@]}" -- "${b[@]}" echo "${c[@]}" # Result: c d === implode === function implode() { local d=${1-} f=${2-} if shift 2; then printf %s "$f" "${@/#/$d}" fi } **Utilisation :** array=(1 2 3) echo $( implode "," "${array[@]}" ) # Output: 1,2,3 echo -e "- $( implode "\n- " "${array[@]}" )" # Output: # - 1 # - 2 # - 3 === explode === function explode() { local output_var=$1 seperator=$2 declare -ga "$output_var=()" mapfile -t "$output_var" < <( tr "$seperator" '\n' <<< "${@:3}" | grep -v '^$' ) } **Utilisation :** explode myarray " " "1 2 3" "4 5" declare -p myarray # Output: # declare -a myarray=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6") explode myarray "\n" " 1 2 3" declare -p myarray # Output: # declare -a myarray=([0]="1" [1]="2" [2]="3") === format_duration === function format_duration { local t=$1 local d=$((t/60/60/24)) local h=$((t/60/60%24)) local m=$((t/60%60)) local s=$((t%60)) [[ $d -gt 0 ]] && printf '%d days and ' $d printf '%02d:%02d:%02d' $h $m $s } === dump_ass_array === function dump_ass_array() { declare -n aarr="$1" echo "\"$1\" = {" for key in "${!aarr[@]}"; do printf ' "%s" => "%s"\n' "$key" "${aarr[$key]}" done echo "}" } **Utilisation :** declare -A myarray myarray[a]="b" myarray[c]="d" dump_ass_array myarray === var_dump === declare -p variableName ===== Gestion des paramètres ===== #!/bin/bash DEBUG=0 BIN_PATH="/bin/binary" EXTRA_ARGS=() function usage() { error="$1" [ -n "$error" ] && echo "$error" cat << EOF Usage : $(basename $0) [-d] [-b /path/to/binary] -b [path] Binary path (default: $BIN_PATH) -d Debug mode -X Enable bash tracing (=set -x) -h Show this message EOF [ -n "$error" ] && exit 1 exit 0 } function debug() { [ $DEBUG -eq 1 ] && >&2 echo -e "$( date '+%Y-%m-%d %H:%M:%S' ) - $@" } idx=1 while [ $idx -le $# ] do OPT=${!idx} case $OPT in -d) DEBUG=1 ;; -h) usage ;; -b) ((idx++)) BIN_PATH=${!idx} if [ ! -x "$BIN_PATH" ] then usage "Invalid binary path ($BIN_PATH)" fi ;; -X) set -x ;; *) EXTRA_ARGS+=( $OPT ) ;; esac ((idx++)) done debug "Extra args: ${EXTRA_ARGS[@]}" ===== Barre de progression ===== declare -A PBARS declare PBID # Create a progress bar # Arguments: # - the progress bar title (default: Progress) # - total count (default: 100) # - bar size (default: use all the width of the terminal with a minimum of 5 caracters) # - the name of the variable use to store the progress bar ID (default: PBID) function pbar_create() { # Define the name of the variable that will store the progress bar ID local pbar_id_var=${4:-}; [[ -z "$pbar_id_var" ]] && pbar_id_var=PBID local -n id="$pbar_id_var" # Generate the progress bar ID id="$( tr -dc A-Za-z0-9 **Utilisation :** pbar_create "Test" 20 for i in $( seq 1 20 ); do pbar_increment sleep 0.1 done pbar_finish **Ajout d'info avant l'ETA :** pbar_create "Test" 20 for i in $( seq 1 20 ); do pbar_increment "" "%d iteration(s) - %d found(s)" $i $(( i/2 )) sleep 0.1 done pbar_finish "" "%d iteration(s) - %d found(s)" $i $(( i/2 )) La fonction [[#format_duration]] est nécessaire.