This is an old revision of the document!
Table of Contents
programmation langage
Programmation Shell
. $CONFIG_FILE⇒ permet de faire un include (notez bien le point + espace “. ”)
Les "$"
Ce sont des variables liées au contexte du script.
$0est le nom du script$1 $2, $3, etcles arguments du script. On peut les décaler grâce à la commandeshift($2 devient $1, $3 devient $2, etc)$*est la liste de tous les arguments$#renvoie le nombre d'argument du script$$renvoie le pid du script courant$!renvoie le pid de la dernière commande$?renvoie le retour (code d'erreur par exemple) de la dernière commande
Les variables
IFS=“\n”(Internal Field Separator) le séparateur de champ est “ENTER” (utilisée par la commande read)
Les fonctions
read
read toto permet de demander une saisie clavier à l'utilisateur.
Pour afficher un texte avant la saisie on utilise -p ; et on peut récupérer plusieurs saisie d'un seul coup :
read -p "Quel est le nombre indique sur votre CB ? Et le cryptogramme visuel de derriere ?" CARD_NUMBER CRYPTO
Expressions arithmétiques
Pour faire un calcul il faut l'encadrer de $((calcul)) ou $[calcul]
echo 1+1=$((1+1))
La fonction puissance s'écrit ** :
echo 2^5=$((2**5))
Pour incrémenter une variable : plusieurs possibilités :
z=`expr $z + 1`z=$(($z+1))z=$((z+1))(entre doubles parenthèses, le $ est optionnel)(( z += 1 ))
Instructions conditionnelles
if
test expr
ou
if [ expr ] then else fi
Exemple sur une seule ligne (-n renvoie TRUE si la chaine n'est pas vide) :
if [ -n "" ]; then echo "1"; else echo "0"; fi 0
NB : Pour tester des conditions multiples, on doit encadrer les tests avec un double crochet : programmation_shell
if [[ TRUE && TRUE || FALSE ]] then echo "TRUE" else echo "TRUE QUAND MÊME !" fi
Les conditions multiples sans parenthèses sont lues dans l'ordre d'apparition (gauche à droite), ici cela équivaut à : (TRUE ET TRUE) OU FALSE. Donc TRUE quand même.
Expression sur les fichiers
-e <file>: existe-f file: existe et non répertoire-d file: existe et est un répertoire-s file: existe et est de taille non nulle-r file: existe et droit en lecture-w file: existe et droit en écriture-x file: existe et droit d'exécution
Chaînes de caractères
str1 = str2str1 != str2-z str: vrai si chaîne de longueur nulle-n str: vrai si chaîne de longueur non nulle
Nombres, comparaison
n1 -eq n2égauxn1 -ne n2non égauxn1 -gt n2plus grand quen1 -ge n2plus grand ou égaln1 -lt n2plus petit quen1 -le n2plus petit ou égal
Opérateurs
!unaire de négation-aet logique-oou logique( expr )paranthésage\( et \)sinon interprétées par le shell
case
Test plusieurs possibilités de <chaîne> (~ifs imbriqués).
case <chaîne> in motif1) commande(s) ;; motif2) commande(s) ;; .. esac
for
Exemples :
for (( i = 1; i <= 5; i++ )) do echo $i done
Ou en une seule ligne de commande :
for i in serveur1 serveur2 serveur3; do ssh $i "(uname -r)"; done
Divers
en vrac
- lire un fichier ligne par ligne
while read line do echo $line done < fic.txt
ou sur une seule ligne :
while read n; do echo $line; done < fic.txt
- commande rsh
rsh -4 -n $serveur $commande > /dev/null 2>&1
- commande ping limitée à 3 envois avec un timeout de 0.05s
ping -c3 -w 0.05 soekris-${cpt} >/dev/null 2>$1
retour=$?
- attente d'un
SIGUSR1(30) pour terminer le script :
trap "echo 'Exiting..' ; exit 0" 30
Substitution de chaine
Pour n'afficher qu'une partie d'une chaine (une sous-chaine donc), on utilise la syntaxe ${tst:<offset>:<length>}.
L'offset c'est l'origine et length c'est le longueur de la chaine affichée.
Par exemple pour afficher la sous-chaine “tata” de “titi tata toto” on utilisera :
test="titi tata toto"
echo ${test:5:4}
tata
(on affiche les 4 caractères à partir du n°5).
Remplacement de chaine
Pour remplacer “toto” par “tata” dans la chaine “test” :
test="titi tata toto"
echo ${test//toto/tata}
titi tata tata
notez bien le double slash (/).