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
- l’excellent Bash Shell Quick Reference de Aurelio Jargas ;
- la bible Advanced Bash-Scripting Guide ;
Voir aussi :
- Ocaml: mon principal langage de développement
- Bash : modèle de script
- Bash : redirection
- Bash : pid d'un processus en arrière plan
- Scripts en ocaml
- Perl pour lire un fichier csv
- Bash : sélection de fichiers par extension
- Bash : variables et redirections
- Bash : faire un menu
- XSLT pour mettre en relation deux documents
- Zenity : des fenêtres pour les scripts
- Bash : mesurer le temps
- Sqlite en ligne de commande
- Les outils que j'utilise
- Perl pour faire des scripts efficaces
- C language and GCC compiler
- Linux : ramassis d'astuces diverses
- Au sujet des tableurs
- Bash sur la ligne de commande
- Filtrage de texte : sed, awk, etc.
- Les couleurs dans un terminal
- Afficher un pourcentage dans une page HTML
- VNC : Virtual Network Computing
- Git : déménagement d'un dépôt
- Quelques liens au sujet de l'analyse statique
- Ocaml: mon principal langage de développement
- Disque dur externe
- Les profiles dans Firefox
- Cryptographie et mail sous Android
- Quelques liens au sujet du C
- Git rebase : pour diviser un commit