Intro

Lancer un script

Quand on définit que le fichier est écrit bash

#!/bin/bash # première ligne du fichier

On le lance en faisant

. file.sh # et pas sh file.sh; dans ce cas, on lance sh et non bash

Problème de permission denied quand on lance en faisant seulement ./file.sh : https://unix.stackexchange.com/questions/203371/run-script-sh-vs-bash-script-sh-permission-denied

Éléments de base

Loops

for file in *
do
    echo $file
done

Référencer toutes les images d’un répertoire

dir=/home/patjennings/Bureau
for f in $(find $dir -name '*.jpg' -or -name '*.png')
do
    echo $f
done

Variables

ma_var="salut"
echo $ma_var # salut

Remplacer le contenu d’une variable

ma_var="salut"
echo $ma_var # salut
ma_var="bonjour" 
echo $ma_var # bonjour

Concaténation

principale="je suis"
secondaire="breton"
phrase="${principale} ${secondaire}"
echo $phrase # je suis breton

Structures conditionnelles

var1=true
var2=false
if [ $var1 != $var2 ]; then # bien laisser des espaces autour des crochets
    echo "pas d'accord"
else
    echo "d'accord"
fi
var1=0
var2=5
if [ $var1 = $var2 ]; then # bien laisser des espaces autour des crochets
    echo "égalité"
elif [ $var1 > $var2 ];then
    echo "var1 gagne"
else
    echo "var2 gagne"
fi
Vérifier si une variable est vide ou pleine
[ -z "$1" ] && echo "Empty" || echo "Not empty"
Vérifier l’existence d’un fichier
[ -f "$file" ] && echo "file exists" || echo "file does not exist"

Arrays

#Declare array with 4 elements
array=('Chou rave' 'Myrtille Deluxe' Panais Noisette)
# get number of elements in the array
elements=${#array[@]}

# echo each element in array
# for loop
for (( i=0; i<$elements; i++)); do
    echo ${array[${i}]}
done

Façon plus simple de faire, plus “bash”

array=("Chou rave" "Myrtille Deluxe" "Panais" "Noisette")

echo "Array items:"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

Détails : https://www.linuxjournal.com/content/bash-arrays

Push dans un array
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

Fonction

log(){
    echo $1 # success
    echo $2 # tarte
}
log "success" "tarte"

Date

date +%Y%m%d-%H%M # renvoie 20200409-1221
date +%Y/%m/%d - %H:%M # renvoie 2020/04/09 - 12:21
DATE=$(date +%d/%m/%Y) # date dans une variable
echo "nous sommes le $DATE" # nous sommes le 09/04/2019

Snippets

Lire une valeur entrée par l’utilisateur

question="Veuillez entrer une courte chaîne de caractère : "
echo -n $question

read answer
echo "Vous avez entré $answer. Bravo !"

Comparer deux valeurs passées en paramètre

#utilisation : . script.sh -i valeur -o valeur
shopt -s lastpipe

# ici, on récupère les paramètres
while getopts i:o: option
do
    case "${option}"
    in
	i) input=${OPTARG};;
	o) output=${OPTARG};;
    esac
done

# Puis on compare
if [ $input = $output ]; then
    echo "Both Strings are equal"
else
    echo "Strings are NOT equal"
fi

Vérifier si un programme est disponible

if hash pandoc >/dev/null 2>&1
# if le soft est là
if hash pandoc 2&>/dev/null
# if le soft n'est pas là

Écrire les messages du terminal dans un fichier

command | tee output.txt Voir https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file#731237