LE BOURNE SHELL ( /bin/sh )} ***************************** Variables, quotes, back-quotes, double quotes --------------------------------------------- VAR='date' echo '$VAR' ----> $VAR echo $VAR "$VAR" ----> date date echo `$VAR` ----> Fri Sep 8 11:57:31 MET DST 1995 DATE=`$VAR` echo "En ce $DATE troisieme jour de formation a l'ENST" echo "En ce `$VAR` troisieme jour de formation a l'ENST" Arguments de la ligne de commande ---------------------------------- #!/bin/sh #set -x echo " Commande: $0 Nb parametres: $# Num process: $$ Arguments: $* " Afichage avec numerotation des arguments ---------------------------------------- #!/bin/sh #set -x echo " Commande: $0 Nb parametres: $# Num process: $$ Arguments: $* " num=1 for i in $* do echo "Argument ${num}: ${i}" num=`expr ${num} + 1` done Affichage en utilisant $1, $#, shift ------------------------------------ #!/bin/sh echo " Commande: $0 Nb parametres: $# Num process: $$ Arguments: $* " num=1 nbarg=$# echo "$nbarg" echo "Argument 8-9-10-11: $8 $9 $10 $11" while [ $# -ne 0 ] do echo "Argument ${num}: $1" shift num=`expr ${num} + 1` done Recherche de fichier --------------------- #!/bin/sh for fichier in $* do find `pwd` -name ${fichier} -print done Syntaxe d'une commande ---------------------- #!/bin/sh usage() { echo "Usage: $1 arg1 arg2" exit } main() { if [ $# -eq 0 ] then usage $0 fi } main $* Lister le contenu d'un repertoire ---------------------------------- #!/bin/sh for nom in `ls ${1:-.}` do test -f ${1:-.}/${nom} && echo "Fichier: ${nom}" test -d ${1:-.}/${nom} && echo "Repertoire: ${nom}" done On envisagera dans le cas d'un répertoire de rappeler récurssivement la commande. #!/bin/sh for nom in `ls ${1:-.}` do test -f ${1:-.}/${nom} && echo "Fichier: ${nom}" test -d ${1:-.}/${nom}&&(/usr/5bin/echo "Rept:$nom";\\ $0 ${1:-.}/${nom}) done EXPRESSIONS REGULIERES *********************** 1- ls -a ${HOME} | grep '^\.' 2- Lignes vides: grep '^$' desordre |wc -l ----> 7 Lignes vides et lignes avec uniquement des blancs: grep '^ *$' desordre | wc -l ----> 8 Lignes avec blancs autour de ":" : Blancs devant le ":" : grep ' *:' desordre # 2 blancs entre ' * # Blancs apres le ":" : grep ': *' desordre # 2 blancs entre : * # SED *** 1- DISK='/dev/dsk/c0t3d0s' echo ${DISK} | sed 's/dsk.*/r&0/' 2- Script sed ( scr_sed ) s/ *:/:/g # 2 blancs entre / * # s/: */:/g # 2 blancs entre : * # /^ *$/d s?/csh$?/enstsh? Commande : sed -f scr_sed desordre >ordre AWK *** Script awk BEGIN { printf("LOGIN HOME SHELL") TOTAL=0 } { printf("%-15s%-35s%-s",$1,$6,$7) TOTAL+=1 } END { printf("TOTAL USER: %d",TOTAL) } Commande : awk -F':' -f scr_awk ordre EXERCICES ********* 1-Inversion de fichier: ----------------------- #!/bin/sh rm ${HOME}/essai/temp nblign=`wc -l $1 | awk '{print $1}'` echo "cpt=$nblign" cpt=0 while [ ${cpt} -le ${nblign} ] do tail -${cpt} $1 | head -1 >>${HOME}/essai/temp cpt=`expr $cpt + 1` done Uniquement avec AWK -------------------. #!/bin/sh awk ' { tab[NR]=$0 } END { for( i=NR ; i > 0 ; i-- ) print tab[i] } ' $1 2-Conversion de date: --------------------- #!/bin/sh #DATE='Mon 12 Aug 1996 xx:xx:xx' DATE=`date` jour=`echo $DATE | awk '{print $1}'` date=`echo $DATE | awk '{print $2}'` mois=`echo $DATE | awk '{print $3}'` annee=`echo $DATE | awk '{print $7}'` heure=`echo $DATE | awk '{print $4}'` echo "$jour $date $mois $annee $heure" case ${jour} in Mon ) jour=Lun;; Tue ) jour=Mar;; Wed ) jour=Mer;; Thu ) jour=Jeu;; Fri ) jour=Ven;; Sat ) jour=Sam;; Sun ) jour=Dim;; esac case ${mois} in Feb ) mois=Fev;; Apr ) mois=Avr;; May ) mois=Mai;; Aug ) mois=Aou;; esac echo "$jour $date $mois $annee $heure"