Système IUT de Villetaneuse
A - Apéritif Q1. Ecrire un chier shell prenant en paramètre deux entiers, qui en afche la somme. S il n y a pas deux paramètres, afcher un message d erreur. Q1.sh if [ $# -eq 2 ] echo $[ $1+$2 ] echo "Erreur : vous devez entrer deux paramètres. " Pour exécuter Q1.sh dans le terminal, il faut d abord penser à mettre les droits d exécution au chier avec «chmod u+x Q1.sh», puis on l exécute ainsi : «./Q1.sh param1 param2». On pouvait aussi écrire $(( $1+$2)) plutôt que $[ $1+$2 ]. Q2. Ecrire un script qui prend en paramètre des entiers et afche le plus grand. Q2.sh if [ $# -eq 3 ] PlusGrand=0 while [ $# -gt 0 ] if [ $1 -gt $PlusGrand ] PlusGrand=$1 shift 1 ne echo "Le plus grand nombre est : " $PlusGrand echo "Erreur : il fallait entrer trois paramètres sur la ligne de commande." Il faut remarquer la présence de l'itération grâce à shift 1. Si elle n'est pas placée à l'extérieur du second if, comme c'est le cas ici, l'itération n'a pas lieu au bon moment et on a droit à des boucles innies ou des bugs divers. Il faut également faire attention aux espaces autour du signe "=" ; il faut éviter d'en mettre sinon il y a des erreurs. 2
Q3. Ecrire un script qui prend en paramètre des entiers et afche le plus grand. Q3.sh nb=5 while [ $nb > 0 ] echo $nb nb=$[ $nb -1 ] ne Il était possible d'écrire nb=$(( $nb -1 )) mais ici encore, il fallait surtout faire attention à ne pas laisser d'espace autour du signe égal. L'espace à l'intérieur de la parenthèse semble ne pas gêner. Q4. Ecrire un script bash qui utilisera une instruction case pour effectuer des opérations arithmétiques : (+, -, x, / ). Q4.sh if [ $# -eq 3 ] case $2 in ( + ) echo $[ $1+$3 ] ;; ( - ) echo $[ $1-$3 ] ;; ( x ) echo $[ $1*$3 ] ;; ( / ) echo $[ $1/$3 ] ;; esac echo "Erreur : vous devez entrer trois paramètres : nb opérateur nb (ex : 3 + 2 ). " Avec case, on cherche si le second paramètre (qui est sensé être un opérateur), est d'une forme ou d'une autre. Selon le cas, il faut exécuter l'ordre qui est lié à l'opérateur trouvé. La syntaxe de case est très importante au niveau des ";;". Cette ponctuation est nécessaire pour le bon fonctionnement du script shell. 3
Q5. Ecrire un script qui listera : current_date, time, username, et current directory. Q5.sh echo " La date d'aujourd'hui est : " `date + %D` echo " Voici l heure qu'il est : " `date + %X` echo "L'utilisateur actuel est : " $USER echo "Le ssier que vous consultez actuellement est : " `pwd` Si on oublie de mettre les commandes entre `et`, l'afchage sera tel que l'on peut le lire ici, car les commandes n'auront pas été exécutées. L'option d'afchage "echo" aura pensé que nous voulions simplement afcher "date + %D" et non la date d'aujourd'hui. Q. Ecrire un script qui prend en paramètre un entier et afche l entier en ordre inverse (123 321). Q.sh if [ $# -eq 1 ] echo $1 rev echo Erreur : il faut entrer un unique paramètre! En fait, " rev" permet de mettre le premier paramètre positionnel à l'envers même s'il s'agit d'une chaine de caractère. En effet, on peut écrire "./Q.sh Marie" et on nous renvoie "eiram". 4
Q7. Ecrire un script qui prend en paramètre un entier et afche la somme des digits qui le composent (123 1+2+3=). Q7.sh for (( i=0 ; i<${#1} ; i=$[i+1] )) car=${1:$i:1} if [ "$car" \< ":" -a "$car" \> "/" ] if [ $i -eq $[${#1}-1] ] echo -n "$car" echo -n "$car+" somme=$[somme+$[car]] echo "$car : n'est pas un digit" exit 0 ne echo "=$somme" Pour i, allant de 0 jusqu'à la taille du paramètre, on range les caractères du paramètre dans "somme" et on additionne le tout. On afche les caractères puis le résultat à la n. "${#1}" nous nne la longueur de la chaine $1. Q8. Quelle commande Unix vous permet de réaliser des opérations arithmétiques sur les réels? echo "3.3 + 4.4" bc Il est également possible d'écrire : echo {3.3+4.4} bc Q9. Comment calculer 5.12+2.5 à partir du prompt Linux? Q9.sh echo 5.12 + 2.5 bc 5
Q10. Comment réaliser dans un shell un calcul sur des réels? Par exemple, on veut a=5., b=8.7, c=a+b. Q10.sh if [ $# -eq 2 ] a=$1 b=$2 c=`echo {$a + $b} bc` echo $c echo Erreur : il faut entrer deux paramètres! La difculté est de trouver comment exprimer le calcul que l'on it faire dans "c". Le plus simple était de faire une commande en utilisant les nnées des questions 8 et 9. On sait que echo {x+y} bc renvoie le résultat d'un tel calcul, alors autant en proter et l'utiliser. Q11. Ecrire un script qui détermine si un chier nné en paramètre existe. Q11.sh if [ $# -eq 1 ] if [ -a $1 ] echo "Le nom de chier nné fait référence a un chier existant." echo "Le nom de chier nné ne fait pas référence a un chier existant." echo "Erreur : il faut un unique paramètre sur la ligne de commande." Ici, l'erreur à éviter était d'écrire : if [ $1 -a ] car cela n'a pas de sens.
Q12. Ecrire un script qui détermine si $1 contient «*». Si oui, «symbol is not required», sinon l ajouter à $1. Q12.sh trouve=0 for (( i=0 ; i<${#1} ; i=$[i+1] )) if [ "${1:i:1}" == '*' ] trouve=$[ $trouve+1 ] trouve=$trouve ne if [ $trouve -gt 0 ] echo "Symbol is not required." echo ${1}/\* Dans cet exercice, il faut parcourir $1 à la recherche du caractère '*'. On stocke les réponses positives dans une variable $trouve initialisée a la valeur 0. Si à l'issue du parcours, $trouve vaut plus de 0, alors le caractère '*' a été trouvé au moins une fois. Ainsi, on afche "Symbol is not required.". Si, au contraire, aucun caractère '*' n'a été trouvé lors du parcours de $1, on afche $1+*. Q13. Ecrire un script qui afche le contenu d'un chier de la ligne $1 à la ligne $2. Q13.sh if [ $# -eq 3 ] tail -n +$1 $3 head -n $2 echo "Error : we need 3 arguments. For example : nb nb lename." Ici, il fallait comprendre que pour saisir un texte de la ligne 5 à la ligne 9, il faut d'abord saisir les lignes 5 et + avec un "tail", puis limiter les lignes à 9 avec un "head". Et il ne fallait pas oublier "-n" pour ornner le tri sinon, il y a des erreurs. 7
Q14. Ecrire un script qui afche les options (de la forme -c, -d, -e) passées sur la ligne de commande. Q14.sh if [ $# -eq 1 ] case $1 in ( -c ) echo " -c clear the screen " ;; ( -d ) echo " -d show list of les in current working directory" ;; ( -e ) echo " -e {editor} start this {editor} if installed " ;; esac echo "Error : we need 1 argument. For example: -c, -d or -e" J'ai modié la question, car elle nécessitait des connaissances que je n'ai pas pour l'instant. J'ai quand même essayé de faire un script qui fait des recherches sur la ligne de commande par rapport à la question nnée. Q15. Ecrire un script que vous insérerez dans votre chier.bash_prole. Il afchera "Good Morning", "Good Afternoon" et "Good Evening" selon l'heure. Q15.sh realtime=`date +%X` time=`date +%X cut -d ':' -f 1` if [ $time -lt 12 ] tell="good Morning" elif [ $time -gt 12 -a $time -le 1 ] tell="good Afternoon" tell="good Evening" echo "$tell $USER, it is $realtime" En premier lieu, il faut récupérer l'heure. Ensuite, selon l'heure, on peut mettre en place trois possibilités dans une variable que l'on afche à la n selon le cas. 8
Q1. Ecrire un script qui afche le message "Hello World" en gras, clignotant, et de différentes couleurs en utilisant la commande "echo". Q1.sh echo -e "\033[1m Hello World" echo -e "\033[5m Hello World" echo -e "\033[33m Hello World" echo -e "\033[34m Hello World" echo -e "\033[31m Hello World" echo -e "\033[35m Hello World" echo -e "\033[40m Hello World" echo -e "\033[31m Hello World" echo -e "\033[35m Hello World" echo -e "\033[34m Hello World" echo -e "\033[0m Hello World" C'est "\033[Xm" qui fait varier les effets de l'afchage du texte avec echo. Q17. Ecrire un script qui implémente un processus en arrière plan qui afche continuellement l'heure courante. Q17.sh J'ignore comment faire. 9
Q18. Ecrire un script qui simule un menu permettant de réaliser les actions nnées. cf Q18 (http://www.lipn.fr/~cerin/se/exercicesshell.html ). Q18.sh La question n'est pas claire. Je ne comprends pas ce qui est demandé. Q19. Ecrire un script qui permet d'afcher différentes informations sur le système. Q19.sh echo " 1) Currently logged user : $USER, logname : $LOGNAME " echo " 2) Your current shell : $SHELL" echo " 3) Your home directory : $HOME " echo " 4) Your Operating system type : $OSTYPE " echo " 5) Your current path setting : $PATH " echo " ) Your current working directory : " `pwd`.. 1 0
Q20. Ecrire un script permettant de réaliser à l'écran, un losange avec des points comme suit : sur la première ligne, il y a 1 point. Sur la seconde ligne il y a 2 points,, sur la ligne la plus grande il y a $1 points. Puis le nombre de points décroit jusqu'à 1 pour former le losange. Q20.sh for (( i=0 ; i<=$1 ; i=$[i+1] )) for (( j=$1 ; j>=i ; j=$[j-1] )) echo -n " " ne for (( k=1 ; k<=i ; k=$[k+1] )) echo -n "." ne echo "" ne for (( i=$1 ; i>=1 ; i=$[i-1] )) for (( j=i ; j<=i$1 ; j=$[j+1] )) echo -n " " ne for (( k=1 ; k<=i ; k=$[k+1] )) echo -n "." ne echo "" ne On commence par créer un premier triangle (grâce a des boucles for imbriquées) nt le nombre de ligne dépend de l'argument nné sur la ligne de commande. Une fois le premier triangle créé, on utilise les nouvelles valeurs de i et j pour créer son uble inversé de manière à faire apparaitre un losange. La difculté, c'est de gérer les espaces dans l'afchage des points. 1 1
Q21. Ecrire un script qui converti un chier de majuscule à minuscule et vice versa selon ce que l'on passe sur la ligne de commande. 1 2