----------------------------------------------------------------------------- Histoire sur un terminal connecte a un systeme SPIX ----------------------------------------------------------------------------- $date Thu Oct 11 17:53:41 MET 1990 $who user3 ttyp0 Oct 11 17:28 serge ttyp1 Oct 11 17:39 serge ttyp2 Oct 11 17:53 $who am i serge ttyp2 Oct 11 17:53 $whoami serge $echo un deux un deux $echo "un deux" un deux $echo "celui qui dans son ciel riait au bruit des clous" > test $echo "Baudelaire" > essai $cat test essai celui qui dans son ciel riait au bruit des clous Baudelaire $mkdir Manip $cd Manip $ls -l /bin/mkdir -rwxrwxr-x 1 bin bin 20600 Oct 20 1989 /bin/mkdir $ls -l /bin/cd /bin/cd: No such file or directory $ls -l . total 0 $ls -ld . drwxrwxr-x 2 serge public 512 Oct 11 17:53 . $cat > fic 1ere ligne 2eme ligne CTRL-d $wc fic 2 4 22 fic $wc -l fic 2 fic $wc -c fic 22 fic $wc -w fic 4 fic $cp fic fic2 $ls -C fic fic2 $mv fic2 fic1 $ls fic fic1 $rm fic1 $ls fic $mv ../test ../essai . $ls -C essai fic test $pwd /users/serge/Manip $ln fic fic1 $ls -l total 4 -rwxrwxr-x 1 serge public 11 Oct 11 17:53 essai -rw-rw-r-- 2 serge public 22 Oct 11 17:53 fic -rw-rw-r-- 2 serge public 22 Oct 11 17:53 fic1 -rw-rw-r-- 1 serge public 49 Oct 11 17:53 test $ls -li total 4 2897 -rwxrwxr-x 1 serge public 11 Oct 11 17:53 essai 15381 -rw-rw-r-- 2 serge public 22 Oct 11 17:53 fic 15381 -rw-rw-r-- 2 serge public 22 Oct 11 17:53 fic1 2898 -rw-rw-r-- 1 serge public 49 Oct 11 17:53 test $cat fic 1ere ligne 2eme ligne $cat fic1 1ere ligne 2eme ligne $rm fic1 $ls -l /users/user1/.profile -rw-r--r-- 1 user1 stage 128 Oct 11 13:27 /users/user1/.profile $ln /users/user1/.profile fic1 $ls -l total 4 -rwxrwxr-x 1 serge public 11 Oct 11 17:53 essai -rw-rw-r-- 1 serge public 22 Oct 11 17:53 fic -rw-r--r-- 2 user1 stage 128 Oct 11 13:27 fic1 -rw-rw-r-- 1 serge public 49 Oct 11 17:53 test $rm fic1 fic1: 644 mode ? y $mkdir dir1 $ls -l total 4 drwxrwxr-x 2 serge public 512 Oct 11 17:53 dir1 -rwxrwxr-x 1 serge public 11 Oct 11 17:53 essai -rw-rw-r-- 1 serge public 22 Oct 11 17:53 fic -rw-rw-r-- 1 serge public 49 Oct 11 17:53 test $mv test dir1 $rmdir dir1 $rmdir: dir1: File exists $rm dir1/test $rmdir dir1 $ls -l total 2 -rwxrwxr-x 1 serge public 11 Oct 11 17:53 essai -rw-rw-r-- 1 serge public 22 Oct 11 17:53 fic $cat > motd UNIX SHELL PROGRAMMING STEPHEN G.KOCHAN PATRICK H.WOOD HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 CTRL-d $cat > essai La tentation d'exister E.M Cioran Gallimard ISBN 2-07-026908-6 CTRL-d $cat * La tentation d'exister E.M Cioran Gallimard ISBN 2-07-026908-6 1ere ligne 2eme ligne UNIX SHELL PROGRAMMING STEPHEN G.KOCHAN PATRICK H.WOOD HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 $echo * essai fic motd $echo * : * essai fic motd : essai fic motd $ls ess* essai $mv essai fic1 $ls fi* fic fic1 $echo *fi *fi $mv motd tic2 $ls ???? fic1 tic2 $ls *[1-2] fic1 tic2 $ls *[!1-2] fic $sort fic1 E.M Cioran Gallimard ISBN 2-07-026908-6 La tentation d'exister $wc -l 1 2 3 CTRL-d 3 $who >users $cat users user3 ttyp0 Oct 11 17:28 serge ttyp1 Oct 11 17:39 serge ttyp2 Oct 11 17:53 $echo Annee Speciale > users $cat users Annee Speciale $echo Option Informatique >> users $cat users Annee Speciale Option Informatique $mv users alire $cat tic2 >>alire $cat alire Annee Speciale Option Informatique UNIX SHELL PROGRAMMING STEPHEN G.KOCHAN PATRICK H.WOOD HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 $>fic3 $ls -l total 4 -rw-rw-r-- 1 serge public 142 Oct 11 17:53 alire -rw-rw-r-- 1 serge public 22 Oct 11 17:53 fic -rwxrwxr-x 1 serge public 63 Oct 11 17:53 fic1 -rw-rw-r-- 1 serge public 0 Oct 11 17:53 fic3 -rw-rw-r-- 1 serge public 107 Oct 11 17:53 tic2 $wc -l alire 6 alire $wc -l users $wc -l fichiers n*: No such file or directory $ls -l fichiers -rw-rw-r-- 1 serge public 0 Oct 11 17:53 fichiers $ls n* 2>fichiers $cat fichiers n*: No such file or directory $date;pwd Thu Oct 11 17:53:59 MET 1990 /users/serge/Manip $sort tic2 > tic2.trie $cat tic2.trie HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 STEPHEN G.KOCHAN PATRICK H.WOOD UNIX SHELL PROGRAMMING $ps PID TTY TIME COMMAND 5985 ttyp2 0:00 ksh 6015 ttyp2 0:02 sh $ps -f UID PID PPID C STIME TTY TIME COMMAND serge 5985 5984 0 17:53:25 ttyp2 0:00 -ksh serge 6015 5985 48 17:53:40 ttyp2 0:02 sh -v shell $grep serge /etc/passwd serge:F/1UaSo7M57mI:120:100::/users/serge:/bin/ksh $who > users $cut -c5- users 3 ttyp0 Oct 11 17:28 e ttyp1 Oct 11 17:39 e ttyp2 Oct 11 17:53 $who | cut -c5- users 3 ttyp0 Oct 11 17:28 e ttyp1 Oct 11 17:39 e ttyp2 Oct 11 17:53 $who | cut -c1-8 user3 serge serge $who | cut -c1-8 | sort serge serge user3 $who | cut -c1-8 | sort serge serge user3 $who | cut -c10-16 ttyp0 ttyp1 ttyp2 $who | cut -c1-8,18- user3 Oct 11 17:28 serge Oct 11 17:39 serge Oct 11 17:53 $tail /etc/passwd > passwd.fin $cut -d: -f1 passwd.fin rachid yasmine zanni lesourd baba ayouch billet daws frezot jebrane $cut -d: -f1,6 passwd.fin rachid:/users/rachid yasmine:/users/yasmine zanni:/users/zanni lesourd:/users/lesourd baba:/users/baba ayouch:/users/ayouch billet:/users/billet daws:/users/daws frezot:/users/frezot jebrane:/users/jebrane $cat tic2 UNIX SHELL PROGRAMMING STEPHEN G.KOCHAN PATRICK H.WOOD HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 $cat fic 1ere ligne 2eme ligne $paste fic1 fic2 1ere ligne UNIX SHELL PROGRAMMING 2eme ligne STEPHEN G.KOCHAN PATRICK H.WOOD HAYDEN BOOKS UNIX SYSTEM LIBRARY ISBN 0-8104-6309-1 $paste -d'+' fic tic2 1ere ligne+UNIX SHELL PROGRAMMING 2eme ligne+STEPHEN G.KOCHAN PATRICK H.WOOD +HAYDEN BOOKS UNIX SYSTEM LIBRARY +ISBN 0-8104-6309-1 $ls alire fic fic1 fic3 fichiers passwd.fin tic2 tic2.trie users $ls | paste -d' ' -s - alire fic fic1 fic3 fichiers passwd.fin tic2 tic2.trie users $sed 's/Cioran/CIORAN/' fic1 La tentation d'exister E.M CIORAN Gallimard ISBN 2-07-026908-6 $who | cut -c1-8 user3 serge serge $who | sed 's/ .*//' user3 serge serge $sed -n '1,2p' fic1 La tentation d'exister E.M Cioran $sed -n '/Cioran/p' fic1 E.M Cioran $sed '1,2d' fic1 Gallimard ISBN 2-07-026908-6 $tr n k < fic1 La tektatiok d'exister E.M Ciorak Gallimard ISBN 2-07-026908-6 $cut -d: -f1,6 passwd.fin | tr : '\11' rachid /users/rachid yasmine /users/yasmine zanni /users/zanni lesourd /users/lesourd baba /users/baba ayouch /users/ayouch billet /users/billet daws /users/daws frezot /users/frezot jebrane /users/jebrane $tr '[a-z]' '[A-Z]' < fic1 LA TENTATION D'EXISTER E.M CIORAN GALLIMARD ISBN 2-07-026908-6 $cat > fichier.tab 1 2 3 CTRL-d $tr -s '\11' < fichier.tab 1 2 3 $tr -d ' ' < fic1 Latentationd'exister E.MCioran Gallimard ISBN2-07-026908-6 $grep serge /etc/passwd serge:F/1UaSo7M57mI:120:100::/users/serge:/bin/ksh $who | grep serge serge ttyp1 Oct 11 17:39 serge ttyp2 Oct 11 17:53 $grep '^s' /etc/passwd shut:17DjD8paQinAo:0:3:0000-Admin0000,,,:/:/imag/bin/shutdown sysadm:*:0:3:0000-Admin0000,,,:/usr/admin:/bin/rsh setup:*:0:3:0000-Admin0000,,,:/usr/admin:/bin/rsh sys:**NO LOGIN**:3:3:0000-Admin0000:/usr: sync::20:1:0000-Admin0000:/:/bin/sync serge:F/1UaSo7M57mI:120:100::/users/serge:/bin/ksh schwande::1007:104::/users/schwande:/bin/ksh $grep '^s.*ksh$' /etc/passwd serge:F/1UaSo7M57mI:120:100::/users/serge:/bin/ksh schwande::1007:104::/users/schwande:/bin/ksh $grep -v 'Cioran' fic1 La tentation d'exister Gallimard ISBN 2-07-026908-6 $grep -l '^E' * fic1 $grep -n 'Cioran' * fic1:2:E.M Cioran $cat > lignes Villon Khayam Cioran Khayam CTRL-d $sort -u lignes Cioran Khayam Villon $sort -r lignes > lignes.1 $cat lignes.1 Villon Khayam Khayam Cioran $sort -ur lignes -o lignes $sort lignes > lignes $ls -l lignes -rw-rw-r-- 1 serge public 0 Oct 11 17:54 lignes $cat > nombres 5 27 2 12 3 33 23 2 -5 11 15 6 14 -9 CTRL-d $sort nombres -5 11 14 -9 15 6 2 12 23 2 3 33 5 27 $sort -n nombres -5 11 2 12 3 33 5 27 14 -9 15 6 23 2 $sort +1n nombres 14 -9 23 2 15 6 -5 11 2 12 5 27 3 33 $cat passwd.fin rachid::1083:129::/users/rachid:/bin/ksh yasmine::1084:129::/users/yasmine:/bin/ksh zanni::1085:130::/users/zanni:/bin/ksh lesourd::1086:130::/users/lesourd:/bin/ksh baba::1087:131::/users/baba:/bin/ksh ayouch::1088:131::/users/ayouch:/bin/ksh billet::1089:132::/users/billet:/bin/ksh daws::1090:132::/users/daws:/bin/ksh frezot::1091:133::/users/frezot:/bin/ksh jebrane::1092:133::/users/jebrane:/bin/ksh $sort +2n -t: passwd.fin rachid::1083:129::/users/rachid:/bin/ksh yasmine::1084:129::/users/yasmine:/bin/ksh zanni::1085:130::/users/zanni:/bin/ksh lesourd::1086:130::/users/lesourd:/bin/ksh baba::1087:131::/users/baba:/bin/ksh ayouch::1088:131::/users/ayouch:/bin/ksh billet::1089:132::/users/billet:/bin/ksh daws::1090:132::/users/daws:/bin/ksh frezot::1091:133::/users/frezot:/bin/ksh jebrane::1092:133::/users/jebrane:/bin/ksh $cat lignes.1 Villon Khayam Khayam Cioran $uniq lignes.1 Villon Khayam Cioran $sort lignes.1 | uniq -d Khayam $cat >> lignes.1 Villon CTRL-d $cat lignes.1 Villon Khayam Khayam Cioran Villon $sort lignes.1 | uniq -c 1 Cioran 2 Khayam 2 Villon : : Question : : En une ligne de commandes unix trouver les 10 mots les plus employes : dans un texte donne ainsi que le nombre d'occurence de chacun de ces : mots dans le texte : $cat > texte on peut on donner pour certains on que le XXIeme siecle, autrement que avance que le notre, regardera Hitler et Staline comme des enfants de choeur. CTRL-d $tr '\' ,;.:' '\12\12\12\12\12\12' < texte | sed '/^$/d' | sort | uniq -c | sort -rn | sed '11,$d' 3 que 3 on 2 le 1 siecle 1 regardera 1 pour 1 peut 1 notre 1 et 1 enfants ----------------------------------------------------------------------------- Histoire connecte sur un terminal SPIX (suite1) le caractere d'attente de commande (prompt) est $ ----------------------------------------------------------------------------- $ cd Manip $ rm -f * $ cat > commande : Bourne Shell who | wc -l CTRL-d $ commande commande: execute permission denied $ ls -l commande -rw-rw-r-- 1 serge public 27 Oct 16 10:40 commande $ chmod +x commande $ ls -l commande -rwxrwxr-x 1 serge public 27 Oct 16 10:40 commande $ commande 1 $ commande > resul $ cat resul 1 $ echo pwd >> commande $ echo date > commande1 $ cat commande >> commande1 $ cat commande1 date : Bourne Shell who | wc -l pwd $ chmod +x commande1 $ commande1 Tue Oct 16 10:40:33 MET 1990 1 /users/serge/Manip $ rm commande commande1 $ cat > stats : Bourne Shell # ceci est une ligne de commentaire # # stats -- imprime : la date , le nombre d'utilisateurs logges # le repertoire de travail # echo la date est l'heure courante est : date echo le nombre d'utilisateurs sur le systeme est : who | wc -l echo le directory courant est : pwd CTRL-d $ chmod +x stats $ stats la date est lheure courante est : date echo le nombre dutilisateurs sur le systeme est : 1 le directory courant est : /users/serge/Manip $ var=1 $ bin=/users/serge/bin $ echo $var 1 $ echo $bin /users/serge/bin $ echo $var $bin 1 /users/serge/bin $ ls $bin A_LIRE manspe $ pwd /users/serge/Manip $ cd $bin $ pwd /users/serge/bin $ nbre=20 $ echo il y a $nbre bouteilles de vin sur la table il y a 20 bouteilles de vin sur la table $ commande=sort $ cd ../Manip $ cat > lignes.11 Khayam Villon Cioran Baudelaire CTRL-d $ $commande lignes.11 Baudelaire Cioran Khayam Villon $ commande=wc $ option=-l $ fichier=lignes.11 $ $commande $option $fichier 4 lignes.11 $ var1=10 $ var2=var1 $ echo $var2 var1 $ var2=$var1 $ echo $var2 10 $ echo $variable $ echo :$variable: :: $ wc $variable -l $variable lignes.11 4 lignes.11 $ wc -l lignes.11 4 lignes.11 $ variable= $ echo :$variable: :: $ variable="" $ echo :$variable: :: $ variable='' $ echo :$variable: :: $ variable=' ' $ echo :$variable: : : $ ls -C lignes.11 resul stats $ x=* $ echo $x lignes.11 resul stats $ # $ # le Shell ne fait pas le "file name substitution " au moment de l'affection $ # mais lorsqu'il execute la commande echo $ # $ # le Shell lit : echo $x et obtient echo * ensuite il remplace * par les $ # noms de fichiers ensuite il appelle echo $ # $ fichier2=noms $ mv $fichier $fichier1 usage: mv [-if] f1 f2 or mv [-if] f1 ... fn d1 (`fn' is a file or directory) $ mv $fichier ${fichier}1 $ ls -l lignes.111 -rw-rw-r-- 1 serge public 32 Oct 16 10:40 lignes.111 $ cat > telephones << CTRL-d CASSAGNE Bernard NP1\B113 4614\4879 DEFUDE Bruno B205 5079 LACOURTE Serge Transeurop 76517879 MOSSIERE Jacques D308 4663 ROUSSET-DE-PINA Xavier Transeurop 76517879 ROUVEYROL Serge B113 4879 CTRL-d $ grep -i serge telephones LACOURTE Serge Transeurop 76517879 ROUVEYROL Serge B113 4879 $ grep -i lacourte serge telephones grep: can't open serge telephones:LACOURTE Serge Transeurop 76517879 grep -i 'lacourte *serge' telephones # # lire lacourte < tabulation>* serge # LACOURTE Serge Transeurop 76517879 $ echo un deux trois quatre un deux trois quatre $ echo 'un deux trois quatre' un deux trois quatre $ fichier=/users/serge/.profile $ echo $fichier /users/serge/.profile $ echo '$fichier' $fichier $ echo * lignes.111 resul stats telephones $ echo '*' * $ echo '< > | ; ( ) { } >> " ` & ' < > | ; ( ) { } >> " ` & $ echo 'Il faut mourrir, > Frere' Il faut mourrir, Frere $ message='Que cherchent-ils au ciel tous ces aveugles ?' $ echo $message Que cherchent-ils au ciel tous ces aveugles ? $ >f $ echo $message Que cherchent-ils au ciel tous ces aveugles f $ texte='* signifie tous les fichiers du directory' $ echo $texte f lignes.111 resul stats telephones signifie tous les fichiers du directory $ x=* $ echo $x f lignes.111 resul stats telephones $ echo '$x' $x $ echo "$x" * $ adresse="Laboratoire LGI/IMAG > BP 53X 38041 Grenoble" e cho $adresse Laboratoire LGI/IMAG BP 53X 38041 Grenoble $ echo "$adresse" Laboratoire LGI/IMAG BP 53X 38041 Grenoble $ x ="'Salamalikoum', dit-il" $ echo $x 'Salamalikoum', dit-il $ x='"Salamalikoum", dit-il' $ echo $x "Salamalikoum", dit-il $ echo > syntax error: `newline or ;' unexpected $ echo \> > $ x=* $ echo \$x $ $x $ echo \\ \ $ echo '\' \ $ ligne=un' 'deux $ echo "$ligne" un deux $ ligne=un\ deux $ echo "$ligne" undeux $ # $ # \ precede $ le shell ignore le $ , enleve le \ et execute echo $ # en passant $x en parametre $ # $ echo "\ est l'anti-slash (backslash in english)" \ est l'anti-slash (backslash in english) $ # $ # \ precede un blanc le shell ignore \ et execute echo $ # en passant \ en parametre $ # $ x=5 $ echo "La valeur de x est \"$x\"" La valeur de x est "5" $ # $ # on veut imprimer sur le terminal $ # <<< echo $x >>> imprime la valeur de x , qui est $x $ # $ echo <<< echo $x >>> imprime la valeur de x , qui est $x syntax error: `<' unexpected $ echo "<<< echo $x >>> imprime la valeur de x , qui est $x" <<< echo 5 >>> imprime la valeur de x , qui est 5 $ echo '<<< echo $x >>> imprime la valeur de x , qui est' $x <<< echo $x >>> imprime la valeur de x , qui est 5 $ echo '<<< echo $x >>> imprime la valeur de x , qui est' "$x" <<< echo $x >>> imprime la valeur de x , qui est 5 $ echo la date et le temps est : `date` la date et le temps est : Tue Oct 16 10:40:48 MET 1990 $ echo le directory courant est `pwd` le directory courant est /users/serge/Manip $ cat >nbusers echo il y a `who | wc -l` utilisateurs logges echo '`who | wc -l`' imprime le nombre d'utilisateurs logges echo " il y a `/bin/ls | wc -l` fichiers dans cd directory " CTRL-d $ maintenant=`date` $ echo $maintenant Tue Oct 16 10:40:50 MET 1990 $ /bin/ls f lignes.111 nbusers resul stats telephones $ fichiers=`/bin/ls` $ echo $fichiers f lignes.111 nbusers resul stats telephones $ # $ # le shell fait disparaitre les retour-chariot et passe autant $ # de parametres que de fichiers a echo $ # $ echo "$fichiers" f lignes.111 nbusers resul stats telephones $ # $ # le shell passe un seul parametre a echo $ # $ cat > fichier.noms serge CTRL-d $ noms=`cat fichier.noms` $ echo "$noms" serge $ cat > message ceci est un message CTRL-d $ mail `cat fichier.noms` < message $ nom="Omar Khayam" $ nom=`echo $nom | tr '[a-z]' '[A-Z]' ` $ echo $nom OMAR KHAYAM $ fichier=/users/serge/bin $ premiercar=`echo $fichier | cut -c1` $ echo $premiercar / $ fichier=exec.o $ dernierchar=`echo $fichier | sed 's/.*\(.\)$/\1/'` $ echo $dernierchar o $ i=1 $ i=$i+1 $ echo $i 1+1 $ # $ # le shell ne fait qu'une substitution de $i par la valeur 1 $ # $ expr 1 + 2 3 $ expr 1+2 1+2 $ # $ # chaque operande ou operateur est un argument de la commande expr $ # $ expr 10 + 20 / 2 20 $ # $ # / plus prioritaire que + $ # $ expr 2 * 7 expr: syntax error $ # $ # * est substituer par le noms des fichiers du directory ( par le shell) $ # $ expr "2 * 7" $ 2 * 7 $ # $ # mauvaise reaction $ # $ expr 2 \* 7 14 $ i=1 $ expr $i + 1 2 $ i=`expr $i + 1` $ echo $i 2 $ # $ # pour des calculs flottants vous pouvez utiliser bc ou awk $ # $ fichier=`echo *` $ echo "$fichier" f fichier.noms lignes.111 message nbusers resul stats telephones $ expr "$fichier" : ".*" 64 $ # $ # nombre de caracteres matche par l'expression reguliere $ # faire man expr $ # ---------------------------------------------------------------------------- Histoire connecte sur un terminal SPIX (suite2) ---------------------------------------------------------------------------- $ cd Manip $ rm -f * $ cat > est-il-la who | grep $1 CTRL-d $ est-il-la user1 est-il-la: cannot execute $ sh est-il-la user1 $ chmod +x est-il-la $ est-il-la bolz bolz ttypc Oct 19 15:46 $ cat > arguments : Bourne Shell echo "il y a $# arguments passes a la commande arguments" echo arg1 = :$1: arg2 = :$2: arg3 = :$3: CTRL-d $ chmod +x arguments $ arguments il y a 0 arguments passes a la commande arguments arg1 = :: arg2 = :: arg3 = :: $ arguments a b il y a 2 arguments passes a la commande arguments arg1 = :a: arg2 = :b: arg3 = :: $ arguments "a b" il y a 1 arguments passes a la commande arguments arg1 = :a b: arg2 = :: arg3 = :: $ >coucou $ >coucou1 $ ls arguments coucou coucou1 est-il-la $ arguments c* il y a 2 arguments passes a la commande arguments arg1 = :coucou: arg2 = :coucou1: arg3 = :: $ mon_bin=/users/serge/bin $ arguments $mon_bin il y a 1 arguments passes a la commande arguments arg1 = :/users/serge/bin: arg2 = :: arg3 = :: $ cat >alire Khayam Cioran Baudelaire Kafka CTRL-d $ arguments `cat alire` il y a 4 arguments passes a la commande arguments arg1 = :Khayam: arg2 = :Cioran: arg3 = :Baudelaire: $ cat > arguments1 : Bourne Shell echo il y a $# arguments passes a la commande $0 echo ces arguments sont :$*: CTRL-d $ chmod +x arguments1 $ arguments1 a b c il y a 3 arguments passes a la commande arguments1 ces arguments sont :a b c: $ arguments1 un deux il y a 2 arguments passes a la commande arguments1 ces arguments sont :un deux: $ arguments1 il y a 0 arguments passes a la commande arguments1 ces arguments sont :: $ arguments1 * il y a 6 arguments passes a la commande arguments1 ces arguments sont :alire arguments arguments1 coucou coucou1 est-il-la: $ cat > telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 Serge ROUVEYROL 4879 CTRL-d $ cat >notel : Bourne Shell grep -i $1 telephones CTRL-d $ chmod +x notel $ notel serge Serge LACOURTE 76517879 Serge ROUVEYROL 4879 $ notel "serge l" grep: can't open l telephones:Serge LACOURTE 76517879 telephones:Serge ROUVEYROL 4879 $ rm notel $ cat > notel : Bourne Shell grep -i "$1" telephones CTRL-d $ chmod +x notel $ notel "serge l" Serge LACOURTE 76517879 $ cat > ajouter : Bourne Shell echo "$1 $2" >> telephones CTRL-d $ chmod +x ajouter $ ajouter 'Michel PAGE ' 5159 $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 Serge ROUVEYROL 4879 Michel PAGE 5159 $ cat >> ajouter sort -o telephones telephones CTRL-d $ ajouter 'Liliane DI-GIACOMO ' 4634 cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Jacques MOSSIERE 4663 Liliane DI-GIACOMO 4634 Michel PAGE 5159 Serge LACOURTE 76517879 Serge ROUVEYROL 4879 Xavier ROUSSET-DE-PINA 76517879 $ cat >detruire sed "/$1/d" telephones > /tmp/telephones mv /tmp/telephones telephones CTRL-d $ chmod +x detruire $ detruire "Serge L" $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Jacques MOSSIERE 4663 Liliane DI-GIACOMO 4634 Michel PAGE 5159 Serge ROUVEYROL 4879 Xavier ROUSSET-DE-PINA 76517879 $ cat >tshift echo $# $* shift echo $# $* shift echo $# $* shift 2 echo $# $* shift echo $# $* shift CTRL-d $ chmod +x tshift $ tshift a b c d e 5 a b c d e 4 b c d e 3 c d e 1 e 0 shift: bad number $ cat >nbparams : Bourne Shell echo $1 echo $9 echo ${10} CTRL-d hmod +x nbparams bparams 1 2 3 4 5 6 7 8 9 10 1 9 10 $ cat >nbparams1 : Bourne Shell arg1=$1 shift echo $arg1 echo $8 echo $9 CTRL-d $ chmod +x nbparams1 $ nbparams1 1 2 3 4 5 6 7 8 9 10 1 9 10 $ # $ # ecrire une commande : home-dir qui recoit en parametre d'entree $ # le nom d'un utilisateur et qui imprime le home-directory associe $ # a cet utilisateur $ # $ # $ # ecrire une commande : suffixe change le nom du $ # fichier en le nom . $ # $ # $ # ecrire une commande : desuffixe qui change le $ # nom en $ # $ cat > si $ if who | grep serge > then > echo "Serge , passez au tableau!" > fi CTRL-d $ chmod +x si $ si serge ttyp5 Oct 19 15:28 serge ttyq0 Oct 19 16:12 Serge , passez au tableau! $ # $ # les commandes standard sur Unix retourn un etat lorqu'elle sont $ # termine , si cette valeur retourne est 0 c'est que la commande $ # s'est bien passe. une valeur differente de 0 que ca s'est mal passe $ # $ cp si si1 $ echo $? 0 $ # $ # $? contient la valeur de retour de la derniere commande executee $ # $ cp si2 si cp: si2: No such file or directory $ echo $? 1 $ who | grep serge serge ttyp5 Oct 19 15:28 serge ttyq0 Oct 19 16:12 $ echo $? 0 $ who | grep ceaucescu $ echo $? 1 $ rm est-il-la $ cat >est-il-la : Bourne Shell # # determiner si un utilisateur est logge # user="$1" if who | grep "$user" then echo "$user est logge" fi CTRL-d $ chmod +x est-il-la $ est-il-la serge serge ttyp5 Oct 19 15:28 serge ttyq0 Oct 19 16:12 serge est logge $ est-il-la ceaucescu $ # $ # modifier la ligne if who | grep "$user" par if who | grep "$user" >/dev/null $ # $ est-il-la rge serge ttyp5 Oct 19 15:28 serge ttyq0 Oct 19 16:12 rge est logge $ # $ # modifier la ligne if who | grep "$users" >/dev/null $ # par : if who | grep "^$users" >/dev/null $ # $ nom=serge > if test "$nom" = serge > then > echo " Je suis Serge" > fi Je suis Serge $ nom= $ if test $nom = serge > then > echo " Je suis Serge" > fi test: argument expected $ # $ # la commande : test = serge , est execute avec seulement 2 arguments $ # il faut executer la commande test "" = serge $ # $ if test "$nom" = serge > then > echo " Je suis Serge" > fi $ echo $? 0 $ # $ # une valeur de statut differente de 0 signifie faux $ # une valeur de statut egale a 0 signifie vrai $ # $ # sur les chaines , avec la commande test, on peut executer : $ # $ # test = $ # test != difference de chaine $ # test n'est pas de longueur nulle $ # test -n n'est pas de longueur nulle $ # test -z est de longueur nulle $ # $ mois=vendemiaire $ test "$mois" = vendemiaire $ echo $? 0 $ mois="vendemiaire " $ test "$mois" = vendemiaire $ echo $? 1 $ test $mois = vendemiaire $ echo $? 0 $ blancs=" " $ test $blancs $ echo $? 1 $ test "$blancs" $ echo $? 0 $ var_nulle= $ var_non_nul=octobre $ test -n "$var_nulle" $ echo $? 1 $ test -n "$var_non_nulle" $ echo $? 1 $ test -z "$var_non_nulle" $ echo $? 0 $ symbole="=" $ test -z "$symbole" test: argument expected $ test x$symbole = x $ # $ # on peut ecrire : test = $ # d'une autre facon : [ = ] $ # (regarder bien les blancs) $ # c'est le shell qui remplacera les crochets par un appel $ # a la commande test $ # $ if [ $mois = vendemiaire ] > then > echo "Nous sommes dans le mois de l'ere vulgaire qu'on appelle octobre" > fi Nous sommes dans le mois de l'ere vulgaire qu'on appelle octobre $ # $ # la commande test et les operateurs arithmetiques $ # $ # -eq = (equal in english) $ # -ge >= (greater or equal in english) $ # -gt > (greater than in english) $ # -le <= (less or equal in english) $ # -lt < (less than in english) $ # -ne != (not equal in english) $ # $ val1=5 $ if [ "$val1" -eq 5 ] > then > echo "cinq est egal a cinq" > fi cinq est egal a cinq $ val2=6 $ if [ "$val1" -ne "$val2" ] > then > echo "cinq n'est pas egal a six" > fi cinq n'est pas egal a six $ x1="005" $ x2=" 10" $ [ "$x1" = 5 ] $ echo $? 1 $ [ "$x1" -eq 5 ] $ echo $? 0 $ [ "$x2" = 10 ] $ echo $? 1 $ [ "$x2" -eq 10 ] $ echo $? 0 $ # $ # la commande test et les operateurs sur les fichiers $ # $ # -d le fichier est un directory $ # -f le fichier est un fichier ordinaire $ # -r le fichier est lisible par le processus (qui execute test) $ # -s le fichier a une longueur non nulle $ # -w le fichier est ecrivable par le processus $ # -x le fichier est executable $ # $ ls -l $HOME/.profile -rw-r--r-- 1 serge public 352 Nov 12 1990 /users/serge/.profile $ fichier=$HOME/.profile $ [ -f "$fichier" ] $ echo $? 0 $ [ -r "$fichier" ] $ echo $? 0 $ # $ # operateurs logiques $ # $ # negation $ [ ! -r "$fichier" ] $ echo $? 1 $ # et logique $ [ -f "$fichier" -a -r "$fichier" ] $ echo $? 0 $ val=8 $ [ "$val" -ge 0 -a "$val" -lt 10 ] $ echo $? 0 $ [ \( "$val" -ge 0 \) -a \( "$val" -lt 10 \) ] $ echo $? 0 $ # $ # ou logique $ # $ val1=0 $ val2=10 $ [ "$val" -eq 0 -o "$val1" -eq 2 -a "val2" -eq 10 ] $ echo $? 1 $ # $ # est identique a $ # $ [ "$val" -eq 0 -o \( "$val1" -eq 2 -a "$val2" -eq 10 \) ] $ echo $? 1 $ [ \( "$val" -eq 0 -o "$val1" -eq 2 \) -a "$val2" -eq 10 ] $ echo $? 1 $ rm est-il-la $ cat >est-il-la : Bourne Shell # # determiner si un utlisateur est logge ou non # user="$1" if who | grep "^$user " >/dev/null then echo "$user est la" else echo "$user n'est plus la" fi CTRL-d $ chmod +x est-il-la $ est-il-la serge serge est la $ est-il-la ceaucescu ceaucescu n'est plus la $ rm est-il-la $ cat >est-il-la : Bourne Shell # # determiner si un utilisateur est logge ou non en verifiant les parametres # if [ "$#" -ne 1 ] then echo "nombre d'arguments incorrects" echo "Usage: est-il-la " else user="$1" if who | grep "^$user " > /dev/null then echo "$user est la" else echo "$user n'est pas la" fi fi CTRL-d $ chmod +x est-il-la $ est-il-la serge serge est la $ est-il-la ceaucescu ceaucescu n'est pas la $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Jacques MOSSIERE 4663 Liliane DI-GIACOMO 4634 Michel PAGE 5159 Serge ROUVEYROL 4879 Xavier ROUSSET-DE-PINA 76517879 $ cat >detruire : Bourne Shell # # detruire un nom de l'annuaire telephonique # if [ "$#" -ne 1 ] then echo " nombre d'arguments incorrect " echo " Usage: detruire " exit 1 fi # # si la commande se termine mal on renvoie une valeur differente de 0 # grep -v "$1" telephones > /tmp/telephones mv /tmp/telephones telephones CTRL-d $ chmod +x detruire $ detruire Bernard Ca nombre d'arguments incorrect Usage: detruire $ echo $? 1 $ detruire "Bernard C" $ cat telephones Bruno DEFUDE 5079 Jacques MOSSIERE 4663 Liliane DI-GIACOMO 4634 Michel PAGE 5159 Serge ROUVEYROL 4879 Xavier ROUSSET-DE-PINA 76517879 $ cat > cava : Bourne Shell heure=`date | cut -c12-13` if [ "$heure" -ge 0 -a "$heure" -le 11 ] then echo "Bon Matin" else if [ "$heure" -ge 12 -a "$heure" -le 17 ] then echo "Bon apres-midi" else echo "Bon soir" fi fi CTRL-d $ chmod +x cava $ cava Bon apres-midi $ cat >cava1 : Bourne Shell heure=`date | cut -c12-13` if [ "$heure" -ge 0 -a "$heure" -le 11 ] then echo "Bon Matin" elif [ "$heure" -ge 12 -a "$heure" -le 17 ] then echo "Bon apres-midi" else echo "Bon soir" fi CTRL-d $ chmod +x cava1 $ cava1 Bon apres-midi $ cd Manip $ rm -f * $ cat > telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 Serge ROUVEYROL 4879 CTRL-d $ cat > ajouter <<'CTRL-d' : Bourne Shell echo "$1 $2" >> telephones CTRL-d $ chmod +x ajouter $ ajouter "DI-GIACOMO Liliane" 4634 $ cat > detruire1 <<'CTRL-d' if [ "$#" -ne 1 ] then echo "Nombre d'arguments incorrect" echo "Usage: detruire1 " exit 1 fi name=$1 # # regarder s'il existe plusieurs noms # matches=`grep "$name" telephones | wc -l` # # si plus d'un erreur sinon le detruire1 # if [ "$matches" -gt 1 ] then echo "il y plus d'un nom; soyez plus precis" else if [ "$matches" -eq 1 ] then grep -v "$name" telephones >/tmp/telephones mv /tmp/telephones telephones else echo " il n'y a pas ce nom dans l'annuaire" fi fi CTRL-d $ chmod +x detruire1 $ detruire1 Nombre d'arguments incorrect Usage: detruire1 $ detruire1 Serge il y plus d'un nom; soyez plus precis $ detruire1 'Serge ROUVEYROL' $ detruire1 'Serge ROUVEYROL' il n'y a pas ce nom dans l'annuaire $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 DI-GIACOMO Liliane 4634 $ ajouter 'Serge ROUVEYROL' 4879 $ cat > detruire2 <<'CTRL-d' if [ "$#" -ne 1 ] then echo "Nombre d'arguments incorrect" echo "Usage: detruire2 " exit 1 fi name=$1 # # regarder s'il existe plusieurs noms # matches=`grep "$name" telephones | wc -l` # # si plus d'un erreur sinon le detruire2 # if [ "$matches" -gt 1 ] then echo "il y plus d'un nom; soyez plus precis" elif [ "$matches" -eq 1 ] then grep -v "$name" telephones >/tmp/telephones mv /tmp/telephones telephones else echo " il n'y a pas ce nom dans l'annuaire" fi CTRL-d $ chmod +x detruire2 $ detruire2 Nombre d'arguments incorrect Usage: detruire2 $ detruire2 Serge il y plus d'un nom; soyez plus precis $ detruire2 'Serge ROUVEYROL' $ detruire2 'Serge ROUVEYROL' il n'y a pas ce nom dans l'annuaire $ # $ # le case $ # $ # case in $ # pattern1) command $ # ...... $ # commande;; $ # pattern2) commande $ # ........ $ # commande;; $ # ........................ $ # patternn) commande $ # .......... $ # commande;; $ # esac $ # $ # est compare successivement aux pattern 1, 2,.jusqu'a ce que $ # le matching ait lieu $ # $ cat >translate <<'CTRL-d' : Bourne Shell # # traduction chiffre en francais # if [ "$#" -ne 1 ] then echo "Usage: " exit 1 fi case "$1" in 0) echo zero;; 1) echo un;; 2) echo deux;; 3) echo trois;; 4) echo quatre;; 5) echo cinq;; 6) echo six;; 7) echo sept;; 8) echo huit;; 9) echo neuf;; esac CTRL-d $ chmod +x translate $ translate Usage: $ translate 0 zero $ translate 3 trois $ translate 10 $ rm translate $ cat > translate <<'CTRL-d' : Bourne Shell # # traduction chiffre en francais # if [ "$#" -ne 1 ] then echo "Usage: " exit 1 fi case "$1" in 0) echo zero;; 1) echo un;; 2) echo deux;; 3) echo trois;; 4) echo quatre;; 5) echo cinq;; 6) echo six;; 7) echo sept;; 8) echo huit;; 9) echo neuf;; *) echo "mauvais argument : il faut que ce soit un chiffre" esac CTRL-d $ chmod +x translate $ translate 10 mauvais argument : il faut que ce soit un chiffre $ cat >chartype <<'CTRL-d' : Bourne Shell # # classification d'un caractere donne en argument # if [ $# -ne 1 ] then echo "Usage: chartype " exit 1 fi # # on s'asssure qu'un seul caractere a ete donne en parametre # char="$1" nbchars=`echo "$char" | wc -c` if [ "$nbchars" -ne 1 ] then echo "Taper un seul caractere s'il vous plait" exit 1 fi # # classsification # case "$char" in [0-9]) echo "c'est un chiffre";; [a-z]) echo "c'est une lettre minuscule";; [A-Z]) echo "c'est une lettre majuscule";; *) echo "c'est un caractere special";; esac CTRL-d $ chmod +x chartype $ chartype Usage: chartype $ chartype 56 Taper un seul caractere s'il vous plait $ chartype 7 Taper un seul caractere s'il vous plait $ chartype d Taper un seul caractere s'il vous plait $ chartype X Taper un seul caractere s'il vous plait $ # $ # le shell a une option -x pour debugger les script Shell $ # $ sh -x chartype v + : Bourne Shell + [ 1 -ne 1 ] char=v + echo v + wc -c nbchars= 2 + [ 2 -ne 1 ] + echo Taper un seul caractere s'il vous plait Taper un seul caractere s'il vous plait + exit 1 $ # $ # on remarque que nbchars a la valeur 2, ceci vient du fait que echo $ # renvoi le caractere + le line feed $ # $ # Il fallait donc ecrire $ # $ rm chartype $ cat >chartype <<'CTRL-d' : Bourne Shell # # classification d'un caractere donne en argument # if [ $# -ne 1 ] then echo "Usage: chartype " exit 1 fi # # on s'asssure qu'un seul caractere a ete donne en parametre # char="$1" nbchars=`echo "$char" | wc -c` if [ "$nbchars" -ne 2 ] then echo "Taper un seul caractere s'il vous plait" exit 1 fi # # classsification # case "$char" in [0-9]) echo "c'est un chiffre";; [a-z]) echo "c'est une lettre minuscule";; [A-Z]) echo "c'est une lettre majuscule";; *) echo "c'est un caractere special";; esac CTRL-d $ chmod +x chartype $ chartype Usage: chartype $ chartype 56 Taper un seul caractere s'il vous plait $ chartype 7 c'est un chiffre $ chartype d c'est une lettre minuscule $ chartype X c'est une lettre majuscule $ cat >chartype1 <<'CTRL-d' : Bourne Shell # # classification d'un caractere donne en argument # if [ $# -ne 1 ] then echo "Usage: chartype " exit 1 fi char="$1" # # classsification # case "$char" in [0-9]) echo "c'est un chiffre";; [a-z]) echo "c'est une lettre minuscule";; [A-Z]) echo "c'est une lettre majuscule";; ?) echo "c'est un caractere special";; *) echo "Taper un seul caractere s'il vous plait" esac CTRL-d $ chmod +x chartype1 $ chartype1 Usage: chartype $ chartype1 56 Taper un seul caractere s'il vous plait $ chartype1 7 c'est un chiffre $ chartype1 d c'est une lettre minuscule $ chartype1 X c'est une lettre majuscule $ chartype1 '>' c'est un caractere special $ # $ # dans le partie pattern du case le | a les sens du OU $ # $ cat >cava <<'CTRL-d' : Bourne Shell heure=`date | cut -c12-13` case "$heure" in 0? | 1[01] ) echo "Bon Matin";; 1[2-7] ) echo "Bon Apres-midi;; * ) echo "Bon soir";; esac CTRL-d $ chmod +x cava $ date Wed Oct 24 16:40:25 MET 1990 $ cava Bon Apres-midi $ # $ # l'instruction nulle : : $ # $ # $ cat > est-il-def <" exit 1 fi if grep "^$1" /etc/passwd >/dev/null then : else echo "$1 n'est pas defini dans /etc/passwd" exit 1 fi CTRL-d $ # $ # les constructeurs && et || $ # $ # commande1 && commande2 $ # $ # est equivalent a : $ # if commande1 $ # then $ # commande2 $ # fi $ # $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 DI-GIACOMO Liliane 4634 $ if sort -r telephones >/tmp/telephones > then > mv /tmp/telephones telephones > fi $ cat telephones Xavier ROUSSET-DE-PINA 76517879 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 DI-GIACOMO Liliane 4634 Bruno DEFUDE 5079 Bernard CASSAGNE 4614\4879 $ sort telephones > /tmp/telephones && mv /tmp/telephones telephones $ cat telephones Bernard CASSAGNE 4614\4879 Bruno DEFUDE 5079 Serge LACOURTE 76517879 Jacques MOSSIERE 4663 Xavier ROUSSET-DE-PINA 76517879 DI-GIACOMO Liliane 4634 $ # $ # commande1 || commande2 $ # $ # est equivalent a : $ # if commande1 $ # then $ # : $ # else $ # commande2 $ # $ cat >est-il-def1 < /dev/null then : else echo "$1 n'est pas defini dans /etc/passwd" fi CTRL-d $ chmod +x est-il-def1 $ est-il-def1 serge $ est-il-def1 ceaucescu cat >est-il-def2</dev/null || echo "$1 n'est pas defini\ dans /etc/passwd" CTRL-d est-il-def serge phase4.sh[380]: est-il-def: cannot execute est-il-def ceaucescu phase4.sh[381]: est-il-def: cannot execute # # # 1) ecrire un programme qui repond oui si le nom passe en parametre # est un nom valide pour un nom de variable Shell # # Exemple: # valide Averroes # oui # valide occam # oui # valide 1939 # no # # 2) Ecrire un programme t_am_pm qui convertit l'heure en notation am ou pm # # Exemple # date # Wed Oct 24 11:26:13 MET 1990 # t_am_pm # 11:26 am # # Faire une version en utilisant expr puis une autre en utilisant case # # 3) Ecrire un programme monsed qui applique une commande sed # donne en parametre a un fichier donne en parametre # # Exemple: # monsed '1,10d' fichier # detruit les 10 premiere lignes de fichier # # 4) Ecrire un programme ok qui retourne un statut de 0 si son argument # est "yes" et 1 autrement. y, yes, Yes, YES, Y sont consideres # comme un "yes" # # Exemple # ok yes # echo $? # 0 # ok no # echo $? # 1 --------------------------------------------------------------------- Histoire sur un terminal connecte a SPIX (Suite4) --------------------------------------------------------------------- $ cd Manip $ rm -f * $ # $ # for in ... $ # do $ # commande1 $ # commande2 $ # ......... $ # commanden $ # done $ # $ for i in 1 2 3 > do > echo $i > done 1 2 3 $ >a0 $ >a1 $ >a $ >b $ >c $ ls a a0 a1 b c $ for i in a[0-2] > do > mv $i $i.d > done $ for i in * > do > mv $i $i.c > done $ liste=`echo a*` $ for i in $liste > do > mv $i $i.e > done $ ls a.c.e a0.d.c.e a1.d.c.e b.c c.c $ for i in `echo [bc]*` > do > mv $i $i.d > done $ ls a.c.e a0.d.c.e a1.d.c.e b.c.d c.c.d $ rm * $ >a $ >b $ touch c $ ls -l total 0 -rw-rw-r-- 1 serge public 0 Nov 21 16:25 a -rw-rw-r-- 1 serge public 0 Nov 21 16:25 b -rw-rw-r-- 1 serge public 0 Nov 21 16:25 c $ # $ # regarder la taille des fichiers crees $ # $ # je me repose une minute $ sleep 60 $ touch c $ ls -l c -rw-rw-r-- 1 serge public 0 Nov 21 16:26 c $ # $ # regarder la date de derniere modification du fichier $ # $ cat >move : Bournne Shell if [ $# -eq 0 ] then echo "Usage: move ... " exit 1 fi suff=$1 shift for i in $* do mv $i $i.$suff done CTRL-d $ chmod +x move $ move 'cc' a b $ ls a.cc b.cc c $ move $ # $ # la difference entre $* et $@ $ # $ cat >args1 : Bourne Shell echo "nombre d'arguments : $#" for arg in $* do echo $arg done CTRL-d $ chmod +x args1 $ args1 a1 a2 a3 nombre d'arguments : 3 a1 a2 a3 $ args1 'a1 a2' a3 nombre d'arguments : 2 a1 a2 a3 $ # $ # dans le for , le Shell remplace $* par $1, $2,... alors qu'il aurait $ # fallu avoir "$1", "$2",.. pour cela il faut utiliser la notation $ # "$@" $ # $ cat >args2 : Bourne Shell echo "nombre d'arguments : $#" for arg in "$@" do echo $arg done CTRL-d $ chmod +x args2 $ args2 a1 a2 a3 nombre d'arguments : 3 a1 a2 a3 $ args2 'a1 a2' a3 nombre d'arguments : 2 a1 a2 a3 $ # $ # Remarque : le for sans indication de in est equivalent $ # a : for in "$@" $ # $ cat >args3 : Bourne Shell echo "nombre d'arguments : $#" for arg do echo $arg done CTRL-d $ chmod +x args3 $ args3 a1 a2 a3 nombre d'arguments : 3 a1 a2 a3 $ args3 'a1 a2' a3 nombre d'arguments : 2 a1 a2 a3 $ # $ # le while $ # $ # while commande $ # do $ # commande1 $ # commande2 $ # ........ $ # commanden $ # done $ # $ # commande est execute et si la valeur retournee par cette commande ($?) $ # est egal a 0 l'ensemble des commandes entre do et done est execute $ # $ cat >twhile : Bourne Shell i=1 while [ "$i" -le 5 ] do echo $i i=`expr $i + 1` done CTRL-d $ chmod +x twhile $ twhile 1 2 3 4 5 $ cat >args4 while [ "$#" -ne 0 ] do echo "$1" shift done CTRL-d $ chmod +x args4 $ args4 a1 a2 a3 a1 a2 a3 $ args4 'a1 a2' a3 a1 a2 a3 $ args4 * a.cc args1 args2 args3 args4 b.cc c move twhile $ # $ # le until $ # $ # until commande $ # do $ # commande1 $ # commande2 $ # ........ $ # commanden $ # done $ # $ # avant de continuer je me repose 30 s $ sleep 30 $ cat >est-il-la : Bourne Shell # # attente de l'arrivee d'un utilisateur # if [ "$#" -ne 1 ] then echo "Usage: est-il-la " exit 1 fi user="$1" # # verifier toute les 30 s # until who | grep "^$user " >/dev/null do sleep 30 done # # en ce point l'utilisateur est logge # echo "$user est la!" CTRL-d $ chmod +x est-il-la $ est-il-la serge serge est la! $ # $ # travail dans le background pour pouvoir travailler avant qu'il n'arrive $ # $ est-il-la bolz | mail serge & $ cat >est-il-la1 : Bourne Shell # # Version2 : option -m pour reception d'un mail lorsde l'arrivee # de l'utilisateur # if [ "$1" = -m ] then mailopt=TRUE shift else mailopt=FALSE fi if [ "$#" -eq 0 -o "$#" -gt 1 ] then echo "Usage: est-il-la1 [-m] " echo " -m demande a etre informe par mail" exit 1 fi user="$1" # # verifier toute les 30 s # until who | grep "^$user " >/dev/null do sleep 30 done # # en ce point l'utilisateur est logge # if [ "$mailopt" = FALSE ] then echo "$user est la!" else echo "$user est la!" | mail serge fi CTRL-d $ chmod +x est-il-la1 $ est-il-la1 Usage: est-il-la1 [-m] -m demande a etre informe par mail $ est-il-la1 serge & $ est-il-la1 -m bolz & serge est la! $ cat >est-il-la1 : Bourne Shell # # Version2 : option -m pour reception d'un mail lorsde l'arrivee # de l'utilisateur # if [ "$1" = -m ] then mailopt=TRUE shift else mailopt=FALSE fi if [ "$#" -eq 0 -o "$#" -gt 1 ] then echo "Usage: est-il-la1 [-m] " echo " -m demande a etre informe par mail" exit 1 fi user="$1" # # verifier toute les 30 s # until who | grep "^$user " >/dev/null do sleep 30 done # # en ce point l'utilisateur est logge # if [ "$mailopt" = FALSE ] then echo "$user est la!" else moi=`who am i | cut -c1-8` echo "$user est la!" | mail $moi fi CTRL-d $ chmod +x est-il-la1 $ est-il-la1 Usage: est-il-la1 [-m] -m demande a etre informe par mail $ est-il-la1 serge & $ est-il-la1 -m bolz & serge est la! $ # $ # sortir d'une boucle $ # $ ls -l /bin/true -rwxrwxr-x 3 bin bin 239 Sep 28 1989 /bin/true $ ls -l /bin/false -rwxrwxr-x 9 bin bin 249 Sep 28 1989 /bin/false $ true $ echo $? 0 $ false $ echo $? 1 $ # $ # je vais boire une cafe ( a tout a l'heure ) $ # $ # cigarette : AAAAH! $ # $ ls a.cc args1 args2 args3 args4 b.cc c est-il-la est-il-la1 move twhile $ cat > est-il-la2' : Bourne Shell while true do user="$1" a=`date | sed 's/.*\(..\):..:.*/\1/'` # # on arrete de boucler a midi # if [ $a -gt 12 ] then break fi if who | grep "^$user " >/dev/null then echo "$user est la!" break fi done CTRL-d $ chmod +x est-il-la2 $ est-il-la2 serge $ # $ # redirection dans une boucle $ # $ for i in est-il* > do > echo $i > done > fichiers $ cat fichiers est-il-la est-il-la1 est-il-la2 $ for i in est-il* > do > if [ "$i" = est-il-la ] > then > echo $i > /dev/tty > fi > done > fichiers $ est-il-la $ cat fichiers $ # $ # redirection du standard error $ # $ for i in est-il* > do > echo $i > est-il-la3 > done 2>fichiers est-il-la est-il-la1 est-il-la2 $ cat fichiers ksh: est-il-la3: not found $ # $ # pipe dans une boucle $ # $ for i in est-il* > do > echo $i > done | wc -l 3 $ # $ # boucle sur une seule ligne $ # $ for i in est-il* ; do echo $i; done est-il-la est-il-la1 est-il-la2 $ # $ # ceci s'applique egalement a while , until , if $ # $ if [ 1 = 1 ] ; then echo oui ; fi oui $ if [ 1 = 2 ] ; then echo oui; else echo non ; fi non $ # $ # EXERCICES $ # $ # Modifier la commande args4 precedente de telle facon que chaque argument $ # soit precede par son numero $ # $ # exemple : $ # args4 a 'b c' d $ # donne : $ # 1: a $ # 2: b c $ # 3: d $ # $ # $ # Modifier la commande est-il-la1 qu'elle imprime le tty ou est logge $ # l'utilisateur $ # $ # exemple : est-il-la bolz $ # donne : bolz est logge sur le terminal ttyp0 $ # $ # $ # Ajouter une option -t a la commande est-il-la1 pour specifier l'intervalle $ # de verification de la presence de l'utilisateur $ # $ # exemple : est-il-la1 -t 300 bolz $ # $ # Ajouter une option -f a la commande est-il-la1 pour verifier l'existence $ # d'un fichier ou d'un directory . $ # $ # exemple : $ # est-il-la1 -f /usr/spool/uucppublic/serge/fichier & $ # $ # Ecrire une commande : collecte , qui s'execute dans le background $ # et compte le nombre d'utilisateurs logges a la fin de chaque intervalle $ # et aussi le nombre de processus qui se sont executes durant cet $ # intervalle. l'intervalle est specifie avec une option -t , avec par defaut $ # un intervalle de 10mn. $ # $ # remarque 1 $ ls > /dev/null & [1] 8694 $ echo $! 8694 $ # $ # la variable $! contient le no du dernier processus execute dans le background $ # $ # remarque 2 $ # $ : & [1] 8695 $ echo $! 8695 $ : & [1] 8696 $ echo $! 8696 $ # $ # une commande nulle est executee dans le background $ # $ # $ # exemple : collecte -t 900 > statistiques & $ # $ # $ # Ecrire une commande : wgrep, qui fonctionne de facon identique a grep $ # mais imprime une fenetre (w comme fenetre) . Cette commande doit imprimer $ # la ligne precedent la ligne matche'e ainsi que la ligne suivante. $ # Attention au cas ou la ligne matche'e est la premiere ou la derniere $ # du fichier $ # $ # Modifier la commande wgrep en ajoutant une option -w qui specifie la taille $ # de la fenetre $ # $ # exemple : wgrep -w 3 bolz fichiers.eleves $ # imprimera les 3 lignes precedant et suivant la ligne contenant la chaine bolz $ # $ # Modifier la commande wgrep pour qu'elle prenne un nombre variables $ # de noms de fichier en argument . Faire preceder chauque ligne resultat $ # par le nom du fichier ( de la meme facon que grep ) $ #