2016 Scripting unix ROUTEURS ET COMMUTATEURS OLIVIER DEHECQ
Table des matières Signalétique... 3 1 Paramétrage de vi pour le scripting... 4 2 Notions de bases... 5 3 Les commandes internes au shell... 7 4 Les conditions... 8 5 Utilisation des fonctions...11 6 Des commandes pour les scripts...12 7 Plus loin avec les variables...14 Olivier DEHECQ http://aide.informatique1.fr Page 2
Signalétique Nota, astuce : Contient une partie serveur web qui traite les réponses statiques. Important, à retenir : Ceci est une chose importante Commande MS-DOS C:\> c:\tomcat5.5\bin\startup.bat Commande UNIX # /tomcat5.5/bin/startup.sh Commande SQL connect / as sysdba Chemin de fichier, ssier, emplacement sur le disque Fichier web.xml Exemple de contenu de cument <Host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true" /> Contenu du fichier web.xml <welcome-file>index.html</welcome-file> Contenu du fichier server.xml port "8080" port d écoute du connecteur Autre contenu de fichier : <role rolename="ruserhelloworld"/> Spécifique aux cuments xml : Balise Nom de propriété Valeur Commentaire Olivier DEHECQ http://aide.informatique1.fr Page 3
1 Paramétrage de vi pour le scripting Editer le fichier ~/.exrc : set numbers set ignorecase set syntax=on set nocompatible set autoindent afficher les numéros de lignes couleurs de syntaxe Olivier DEHECQ http://aide.informatique1.fr Page 4
2 Notions de bases 2.1 Le she bang #!/bin/bash toujours placer en début de script, indique le shell utilisé, sinon le script s exécute en shell utilisateur Attention : pour Unix, on ne peut utiliser que le bourne shell : #!/bin/sh 2.2 Variable VS Variable d environnement set env liste de toutes les variables, uniquement dans le shell en cours liste des variables d environnement, dans tous les shell et sous-shell var=toto export var=toto Une variable non exportée n existe que dans le shell où elle a été définie crée une variable crée une variable d environnement Attention : une variable ne peut pas commencer par [0-9], ne contient que [a-z]+[_]+[0-9] echo $$ echo $? numéro de processus courant code retour (=0 : la commande s est bien passée ;!=0 : la commande ne s est pas déroulée comme prévu $1 - $9 argument entré à la suite de la commande d exécution du script echo $#./test.sh olivier Dehecq echo $1 olivier echo $2 dehecq nombre d arguments envoyés (2 dans la commande précédente) isole tous les caractères " " isole tous les caractères sauf ` \ $ 2.3 Caractères spéciaux du shell ; ls ; date sert à enchainer deux commandes, exécutées l une après l autre && && la commande à droite sera exécutée que si la partie gauche s est bien exécutée (ex. : ls test.sh && echo OK) la commande à droite ne sera exécutée que si la commande à gauche ne s est pas bien exécutée (ex. : ls test.sh echo KO) Olivier DEHECQ http://aide.informatique1.fr Page 5
2.4 Regroupement des commandes ( ls /bin ; ls /usr/bin ) wc l ce qui est entre ( ) est exécuté dans un sous shell { ls /bin ; ls /usr/bin; } wc l ce qui est entre { ; } est exécuté dans un sous shell ls xys { echo "fichier introuvable" ; var = Alerte ; } 2.5 Utiliser les couleurs dans le shell couleur caractères fond attribut Noir 30 40 0 : aucun Rouge 31 41 1 : gras Vert 32 42 4 : souligné Brun 33 43 7 : inversé Bleu 34 44 8 : invisible Majenta 35 45 9 : barré Cyan 36 46 Blanc 37 47 Exemple \033[1;32m : \033[ : annonce de couleur 1;32 : arguments m : fin de la définition Le résultat serait nc du texte vert, en gras. Codes couleurs et codes attributs Olivier DEHECQ http://aide.informatique1.fr Page 6
3 Les commandes internes au shell La commande read : La commande read stocke une chaine entrée sous la variable voulue. Remplace PAUSE tel.sh : echo "saisissez votre nom : " read NOM echo "saisissez votre numéro de téléphone : " read TEL echo "bonjour $NOM, votre numéro de tel est le : $TEL" La commande echo : -e en bash, interprète les caractères spéciaux \n nouvelle ligne \t tabulation \c enlève le retour à la ligne après echo e "\ncoucou\n" La commande exec : Exécute une commande dans le shell en cours puis le quitte exec echo "bonjour et au revoir" La commande exit : Arrête le shell courant et définit la valeur de? Nota : exit 22 ne quitte pas le script La commande expr : Calcul arithmétique. Préférer let et (( )) Olivier DEHECQ http://aide.informatique1.fr Page 7
4 Les conditions 4.1 La commande test test ou [ ] [ -f xyz ] echo KO Test sur les fichiers : -f fichier -d répertoire -x droit d exécution (-w r) -s taille >0 Opérateur de chaine : [ "$NOM" = "root" ] && égal à!= différent de -n variable non nulle -z variable nulle [ -z "$1" ] Test sur les valeurs numériques : [ "$AGE" eq 18 ] égal -ne -gt ; -ge -lt ; -le différent > ; < ; Combinaisons : -a et -o ou! négation \( \) regroupement Pour la comparaison de chaines : * 0 à n caractères? 1 caractère [...] un caractère parmi ceux entre [] [!...] un caractère qui n est pas entre [] Tests de chaines : shopt grep extglob it être sur [on] : shopt s extglob (activer) shopt u extblob (désactiver)?(...) 0 à 1 fois la chaine *(...) 0 à n fois la chaine +(...) 1 à n fois la chaine @(...) 1 fois la chaine!(...) 0 fois la chaine *(......) de 0 à n fois la chaine1 ou la chaine2 (fonctionne avec *+@!) Olivier DEHECQ http://aide.informatique1.fr Page 8
4.2 if else 4.3 Case [[ var =?([+-]+([0-9]) ]] && echo "Le nombre entier est valide" if condition if condition if condition then then then action1 action1 action1 action2 action2 action2 fi else else if condtion2 elif et else if fi : elif n attend pas de fi action3 fi else if attend fi à la fin de la boucle case $COULEUR in noir) echo "vous avez choisi noir" ;; blanc) echo "c est le blanc qui est choisi" ;; rouge) echo "là c est le rouge" ;; then action3 fi jaune orange) echo "orange ou jaune c est du pareil au même" ;; *) echo "la couleur choisie n est pas autorisée" ;; esac 4.4 while Tourne en boucle tant que la condition est vraie. while condition while [ -z "$NOM" ] action1 read p "Entrez votre nom : " NOM action2 Attention : while : peut créer une boucle infinite while : echo "1) création d un compte utilisateur" echo "2) modification d un compte utilisateur" echo "3) suppression d un compte utilisateur" echo "q) quitter read A case $A in créer-compte.sh ;; modif-compte.sh ;; suppr-compte.sh ;; q) exit 0 ;; *) echo "saisie incorrecte" ;read ;; esac Olivier DEHECQ http://aide.informatique1.fr Page 9
4.5 until 4.6 for Tourne en bouche jusqu à ce que la condition soit vraie. Opposé de while until condition until [ -n "$NOM" ] action1 read p "Entrez votre nom : " NOM action2 Test sur des valeurs inconnues, liste for VAR in * for A in *.rpm echo $VAR rpm qpl $A grep libtruc.so >/dev/null && echo $A for VAR in 1 2 3 toto (renverrait "1 2 3 toto". Pour isoler on utilise IFS 1 ) echo VAR (1 /n 2 /n 3 /n toto) Nota set grep ^IFS IFS est utilisé comme champ de séparation par for. \t\n par défaut. Espace, tabulation, entrée for (( i=10 ; i >=1 ; i-=1 )) echo "mise à feu dans $i sec." sleep 1 echo '!!! BOUM!!!' valeur initiale ; condition ; incrémentation/décrémentation 1 IFS : champ de séparation utilisé par for. \t\n par défaut. espace, tabulation, entrée Olivier DEHECQ http://aide.informatique1.fr Page 10
5 Utilisation des fonctions Une fonction peut être présente : dans le script qui l exécute dans un autre fichier Bienvenue() { echo "Bienvenue $LOGNAME" echo Nous sommes le `date +%D` } Bienvenue Attention : la commande it être lue par le shell AVANT d être appelée!! création de la fonction appelle la fonction 5.1 Arguments dans les fonctions Bienvenue() { echo "Bienvenue $2 $1" rappelle les arguments 2 et 1 echo Nous sommes le `date +%D` } read p "quel est votre prénom : " PRENOM read p "quel est votre nom : " NOM Bienvenue $PRENOM $NOM 5.2 Externaliser les fonctions Intégration d une fonction externe dans un script A propos de «l include» (appel de fonction) :. fichier.fonction est le chemin relatif vers la fonction. on peut entrer le chemin absolu :. /data/scripts/fichier.fonction Olivier DEHECQ http://aide.informatique1.fr Page 11
6 Des commandes pour les scripts eval : uble évaluation vert="\033[32 ;1m" rouge="\033[31 ;1m" read p "Choisissez une couleur (vert ou rouge) : " COULEUR echo e "$$COULEUR Bonjour" pas bon car $$ renvoit le PID 2 eval echo e "\$$COULEUR Bonjour" trap : réaffecter les signaux envoyés au processus Nota : on ne peut pas renvoyer kill -9 trap commande de remplacement signal trap 'rm f *.tmp ;exit1' INT TERM clear : script : clear Affiche un écran vide. Ne vide pas l écran calcule $couleur puis $vert ou $rouge script Enregistre tout ce qui apparaît à l écran dans un fichier tr : remplacement de caractère, suppression de ublons. Mode caractère cat fonctions.sh tr 'abc' 'yxz' remplace a par x, b par y, c par z tr '[:lower :]' '[:upper:]' remplace les minuscules par des majuscules tr d 'abc' tr s '\n' supprime les a, les b et les c supprime les lignes vides tr s '\t' ' ' remplace les \t par des espaces, remplace les ublons d espaces cut : découpage vertical (caractère/champ) cat /etc/passwd cut c 1,5-10 récupère les caractères 1 et 5 à 10 (collés) cut f1 d: récupère le 1er champ, délimiteur : who tr s ' ' ' ' cut f1,4 d' ' split : découpage de fichiers en blocs de lignes : split gros-fichier.log petit-fic- petit-fic-aa petit-fic-ab petit-fic-ac Nota : l inverse de split est cat cool?? > fusion.log sort : trier les colonnes cat client sort cat client sort k2 -k3n -k2r -k1,1 k3n enlève les espace en trop, sélectionne les champs par défaut découpe en morceaux de 100 lignes trie de A à Z du 1er caractère jusqu au dernier caractère trie de A à Z de la 2e colonne jusqu au dernier caractère trie de 0 à 9 de la 3e colonne jusqu au dernier caractère trie de Z à A de la 2e colonne jusqu au dernier caractère trie de A à Z du champ1 au champ 1 puis de A à Z du 3e champ à la fin sort b k4.5 k4.3,4.4 k4.1,4.2 b : ne pas tenir compte des espaces avant k4.1,4.2 : du champ4 1er car au champ4 2e car 2 echo $$ numéro de processus courant Olivier DEHECQ http://aide.informatique1.fr Page 12
uniq : supprimer les lignes consécutives en plusieurs exemplaires Attention : les lignes DOIVENT ETRE CONSECUTIVES, on fait un sort avant! uniq [options] fichier1 [fichier2 ] -c chaque ligne est préfixée du nombre d occurrences sort fic1 uniq -d n affiche que les lignes en plusieurs exemplaires -f3 compare les 3 premiers champs sur la ligne. (-w3 caractères) -i ignore la casse 6.1 sed : recherches, remplacement sed 's/martin/henry/' clients sed i 's/martin/henry/' clients sed 's#henry#martin#' clients sed 's/henry/martin/g' clients sed 's/henry/martin/2' clients sed '3 s/henry/martin/' clients sed n'/martin/p' clients sed n '/Martin/=' clients Henry remplacé par Martin. Sortie écran par défaut Henry remplacé par Martin. Modifie le fichier on peut remplacer le séparateur de chaîne traiter toutes les occurrences de ligne remplacer seulement la 2e occurrence de ligne traiter seulement la 3e ligne afficher uniquement les lignes contenant Martin afficher les n des lignes contenant Martin sed n '/Dupont/,/Martin/p' clients afficher du 1 er Dupont au 1 er Martin sed '/Martin/d' clients sed '/Martin/!d' clients sed '/Dupont/i<chaine>' client Créer un fichier de commandes : Contenu du fichier sed.commande supprimer les lignes contenant Martin /Dupont/i---attention\nmauvais payeur--- /Dupont/a---mais son compte est bien garni--- sed f sed.commande clients pour l exécuter 6.2 awk : super puissant awk '/bash/ {print $0}' /etc/passwd supprimer les lignes ne contenant pas Martin ajouter une chaine dans la ligne avant Dupont (a après) affiche toute la ligne contenant bash awk F: '/bash/ {print $1}' /etc/passwd affiche le champ1 (séparateur :) awk F: '/bash$/ {print "n : " NR,$1 "UID : " $3 "Répertoire : " $6}' Nota : NR = numéro de ligne awk F: '$1 ~/user/ {print $0}' /etc/passwd NF : nombre de champs sur la ligne $NF : contenu du dernier champ sur la ligne afficher toute la ligne nt le champ1 contient user Olivier DEHECQ http://aide.informatique1.fr Page 13
7 Plus loin avec les variables Substitution des variables echo ${nom - invité} affiche $nom. Si n existe pas : affiche «invité» echo ${nom :- invité} affiche $nom. Si n existe pas ou vide : affiche «invité» (utile après un read) echo ${nom :=invité} affiche $nom. Si n existe pas ou vide : définit nom= «invité» while ${#tel!= 10} nombre de caractères de $tel, teste si 10 var=fic.save;echo ${var#??} retire (de la gauche vers la droite) 2 caractères quelconques echo ${var#.*} retire (de la gauche vers la droite) la 1ere occurrence trouvée de.* echo ${var##.*} retire (de la gauche vers la droite) la dernière occurrence trouvée de.* echo ${var%/*} retire (de la droite vers la gauche) la 1ere occurrence trouvée de /* echo ${var%%/*} retire (de la droite vers la gauche) la dernière occurrence trouvée de /* L arithmétique entière : let et (( )) typeset i var=10 déclarer var de type integer et égale à 10 unset var=toto let var=5+10 let nb=var*2 enlève le typeset calcule et attribue à var=15 calcule et attribue à nb=30 (( nb = var * 2 )) même chose que (( nb=$var*2 )) Incrémenter (( nb=nb+1 )) ou (( nb+=1 )) Comparer min=100 (( heure=min/60 )) (( minutes=min%60 )) echo $(( heures=min/60 ))H$(( minutes=min%60 ))min < > <= >=!= (different) == (égal) && (et) (ou)! (non) (( k==i+j && h==k*2 )) ; echo $? Les variables de tableau client=dupont echo $client echo ${client} echo ${client[0]} affiche Dupont affiche Dupont affiche Dupont Nota : on peut remplacer par [1] : affichera la 2 e valeur client[1] = Alexandre echo ${client[0]} echo ${client[1]} echo ${client[*]} nom=0 ; prenom=1 echo ${client[prenom]} echo ${#client[*]} Si on utilise [*] : affichera les valeurs de tous les index affiche Dupont affiche Alexandre affiche Dupont Alexandre affiche alexandre affiche le nombre d index utilisés % : modulo Olivier DEHECQ http://aide.informatique1.fr Page 14
Olivier DEHECQ http://aide.informatique1.fr Page 15