Bash : pour écrire des scripts

Anne langage bash script csv

On peut faire beaucoup de choses avec un script bash, mais attention, s’il s’agit de faire pas mal de calcul, il vaut mieux utiliser perl qui est beaucoup plus rapide.

Boucle

for f in $(ls *.ml) ; do
  echo "file: $f"
done

Lire les lignes d’un fichier :

while read line ; do
  ... $line ...
done < $input_file

ou encore, pour lire quelques colonnes d’un fichier .csv par exemple :

while IFS=',' read c0 _ c2 ; do
  ... $c0 ... $c2 ...
done < $input_file

ou si on a plutôt les numéros de colonnes:

while IFS=',' read -a line; do
  ... ${line[$i]}
done < $input_file

Pour lire un tableau:

for i in "${!arr[@]}"; do
  echo "$i: ${line[$i]}"
done

Compter :

for (( i = 0 ; i <= 100 ; i+=1 )) ; do
  echo "... $i..."
done

Fonction

function process() {
  local arg1=$1
  local arg2=$2
  local name="$arg1__$arg2"
  ...
}

Découpage

local f10=$(echo "$line" | cut -d';' -f10)

Variables

Pour prendre la valeur d’une variable dont on a le nom dans une variable: ${!var}.

Matching

# optional space
opt_space_re="[ ]*"
# simple identifier
id_regex="[\[:alpha:]][[:alnum:]_]*"
local regex="${opt_space_re}function[ ]+$id_regex[ ]+return[ ]+$id_regex"
if [\[ "$def" =~ $regex ]] ; then
  local nb_match=${#BASH_REMATCH[*]}
  local f_name=${BASH_REMATCH[1]}
  local r_name=${BASH_REMATCH[2]}
  ....
fi

Tableaux

Tableau pour faire une liste

  • déclaration :

      declare -a messages
    
  • nombre d'éléments dans le tableau

      n=${#messages[@]}
    
  • ajouter un message à la fin du tableau :

      messages[$n]="$msg"
    

    ou plus simplement :

      messages+=( "$msg" )
    
  • parcourir le tableau :

    for m in "${messages[@]}" ; do
      echo $m
    done
    

Tableau associatif

declare -A G_ident
...
G_ident["toto"]="machin"
...
for id in "${!G_ident[@]}" ; do
  local info=${G_ident["$id"]}
  echo "$id -> $info"
done

Pour tester si un élément est présent dans le tableau, on pourrait penser qu’il suffit de faire le test [ -n ${G_ident[key]} ] mais ça ne fonctionne pas si on utilise l’option nounset car l’accès à une donnée non initialisée produit alors une erreur.

La solution est :

if [ -n "${G_ident[key]+foo}" ] ; then
  echo "l'entrée 'key' est présente dans le tableau et vaut ${G_ident[key]}"
else
  echo "l'entrée 'key' n'est pas présente dans le tableau
fi

Documentation

Voir aussi :