Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices scripts Bash

3 décembre 2015 à 16:03:42

Bonjour à tous,

j'ai écrit une quarantaine d'exercices de scripts Bash. Je me suis dis que ça pourrait intéresser les gens. Bien sûr je donne une proposition de solution avec chaque sujet.

Est-ce que ça intéresse quelqu'un ?

**********

Pré-requis : lire le cours linux du site https://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux ou au minimum avoir accès à un shell.

Rappels sur l'écriture d'un script Bash :

Les scripts portent l'extension .sh pour les reconnaître. Il s'agit d'une simple convention.

La première ligne de vos scripts sera:

#!/bin/bash

Pour écrire des commentaires, placez un # en début de ligne ou à la suite d'une commande.

Pour pouvoir exécuter vos scripts, mettez dessus les droits d’exécution avec la commande

chmod +x script.sh

Faites ensuite ./script.sh pour lancer le script script.sh si vous êtes dans le dossier contenant le script. Autrement il faut indiquer un chemin absolu:

/home/nom_utilisateur/bootcamp_bash/script.sh

Vous pouvez également ajouter le dossier contenant les exercices au PATH pour pouvoir éxécuter vos scripts à partir de n'importe quel endroit:

PATH=${PATH}:${HOME}/bootcamp_bash/



-
Edité par èmji 9 décembre 2015 à 14:41:04

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2015 à 23:29:48

C'est toujours bon à prendre ! :-)
  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2015 à 14:56:41

LEVEL 1

Exercice 1 : date.sh

Écrire un script qui affiche la date au format hh:mm:ss jj/mm/aa

Exemple :

./date.sh
15:44:57 19/11/15

Exercice 2 : melimelo.sh

Écrire un script qui affiche l'emplacement du fichier  tutor. Vous aurez peut-être besoin de passer en root temporairement.

Si le fichier n'est pas présent sur votre système, vous pouvez travailler sur n'importe quel fichier de plus de 26 lignes.

A l'aide d'une unique ligne de commandes bash, affichez les 26 dernières lignes du fichier tutor, de la dernière à la première, écrites à l'envers, en supprimant les lignes vides, précédé du numéro de la ligne (la dernière ligne aura le numéro 20), le tout trié dans l'ordre alphabétique.

Exercice 3 : nb_lignes.sh

Complétez la ligne de commandes précédente afin qu'elle renvoie maintenant le nombre de ligne qu'elle affichait à l'écran précédemment.

Exemple :

./nb_lignes.sh
20

Exercice 4 : groupes.sh

Affichez les trois premiers groupes auxquelles vous appartenez séparés par des points virgules, et terminé par un point.

Exemple :

./groupes.sh
matthieu;adm;cdrom.

Exercice 5 : sort.sh

Écrire un script qui affiche ses paramètres dans l'ordre alphabétique suivi d'un retour à la ligne.

Exemple :

./sort.sh un deux trois quatre cinq
cinqs deux quatre trois un

Exemple 2 :

./sort.sh "un deux trois quatre cinq"
cinqs deux quatre trois un

Exercice 6 : users.sh

Écrire un script qui affiche dans l'ordre alphabétique la liste des utilisateurs dont des processus sont en cours d'exécution sur le système.

Exemple :

./users.sh
avahi
colord
kernoops
...
whoopsie



-
Edité par èmji 9 décembre 2015 à 15:08:44

  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2015 à 15:20:33

SOLUTIONS LEVEL 1

Exercice 1 : date.sh

#!/bin/bash
date '+%H:%M:%S %d/%m/%y'

Exercice 2 : melimelo.sh

#!/bin/bash
sudo find / -name tutor
echo -e "\n"
tail -n 26 /usr/share/vim/vim74/tutor/tutor | tac | rev | egrep -v '^$' | cat -n | sort

Exercice 3 : nb_lignes.sh

#!/bin/bash
tail -n 26 /usr/share/vim/vim74/tutor/tutor | tac | rev | egrep -v '^$' | cat -n | sort | wc -l

Exercice 4 : groupes.sh

#!/bin/bash
groups | cut -d ' ' -f 1-3 | tr ' \n' ';.' | sed 's/.$/.\n/g'

Exercice 5 : sort.sh

#!/bin/bash
echo $* | tr ' ' '\n' | sort | tr '\n' ' ' | sed 's/ $/\n/'

Exercice 6 : users.sh

#!/bin/bash
ps aux | grep -v 'USER' | cut -d ' ' -f 1 | sort | uniq

-
Edité par èmji 11 décembre 2015 à 11:46:22

  • Partager sur Facebook
  • Partager sur Twitter
10 décembre 2015 à 13:17:37

LEVEL 2


Exercice 1 : params1.sh

Écrire un script qui renvoie le nombre de paramètres avec lesquels il a été appelé.

Exemple :

./params1.sh un deux trois
J'ai été appelé avec 3 arguments.

Exercice 2 : plus_grand_rep.sh

Usage : plus_grand_rep dir1 dir2

Affiche le répertoire qui possède le plus de références entre dir1 et dir2.

Exercice 3 : seq1.sh

Usage : seq1.sh int

Écrivez un script qui affiche les entiers de 1 à int.

Exemple :

./seq1.sh 4
1
2
3
4

Exercice 4 : home.sh

Écrire un script qui demande à l'utilisateur le chemin absolu de son home. L'utilisateur à 5 secondes pour entrer le chemin, sinon le script affiche "Trop tard !"

Exemple :

Chemin absolu de votre home : /home/matthieu
Votre home se trouve ici : /home/matthieu

Exemple 2 :

Chemin absolu de votre home : 
Trop tard !

Exercice 5 : seq2.sh

Usage : seq2.sh last
Usage : seq2.sh first last
Usage : seq2.sh first increment last

Écrivez un script qui imite le comportement de la commande seq.

Exemple :

./seq2.sh 2 3 10
2
5
8

Exercice 6 : params2.sh

Écrire un script qui affiche son nom, puis le chemin par lequel il a été appelé, puis tout ses arguments un à un.

Exemple :

./params2.sh un deux trois quatre cinqs six sept huit neuf dix onze
nom: params.sh
chemin: .
argument 1 : un
argument 2 : deux
argument 3 : trois
argument 4 : quatre
argument 5 : cinqs
argument 6 : six
argument 7 : sept
argument 8 : huit
argument 9 : neuf
argument 10 : dix
argument 11 : onze

Exercice 7 : max1.sh

Usage: max1.sh int1 int2

Écrire un script qui prend deux entiers en arguments et qui affiche le plus grand des deux.

Exemple :

./max1.sh 3 3
3

Exemple 2 :

./max1.sh 8 4
8

Exercice 8 : max2.sh

Usage: max2.sh int1 int2 int3

Écrire un script qui prend trois paramètres et qui affiche le plus grand des trois.

Exercice 9 : nombre_mystere.sh

Il faut deviner le nombre mystère. Celui-ci est compris entre 1 et 1000. Le joueur a dix essais.

Exemple :

Entrez un nombre entre 1 et 1000 : 500
Le nombre est plus grand.
Il vous reste 9 essais.
Entrez un nombre entre 1 et 1000 : 750
Le nombre est plus petit.
ntrez un nombre entre 1 et 1000 : 565
Vous avez gagné !

Exemple 2 :

Entrez un nombre entre 1 et 1000 : 500
...
Entrez un nombre entre 1 et 1000 : 10
Il vous reste 0 essais.
Vous avez perdu ! Le nombre mystère était 9.

Exercice 10 : max3.sh

Usage: max3.sh int1 ... intn

Écrire un script qui affiche le plus grand de tous ses paramètres.

Exercice 11 : cat.sh

Émulez la commande cat à l'aide d'un script.

Exemple :

./cat.sh
   bonjour
bonjour

echo "  bonjour" > file
./cat.sh file
bonjour



Exercice 12 : fichiers.sh

Écrire  un script qui crée dans le répertoire courant un répertoire nommé 'files' et qui quand on fait un ls -gG dessus donne le résultat suivant :

total 16
-rwxrwxrwx 1    0 janv.  2 03:04 file1
-r---w---x 2   10 nov.  26 15:45 file2
---S------ 1   20 mars   4 05:06 file3
d-wxr--r-x 2 4096 avril  5 06:07 file4
pr--r-xr-x 1    0 juil.  8 09:10 file5
-r---w---x 2   10 nov.  26 15:45 file6
lrwxrwxrwx 1    5 nov.  26 15:45 file7 -> file1

A la place du 26 novembre 15:45 vous aurez la date d'exécution du script. Le reste doit être identique.

Exercice 13 : ls_path.sh

Affiche le contenu de tous les répertoires qui apparaissent dans le chemin absolue du répertoire courant.

./ls_path
/home/matthieu
bootcamp_bash  Desktop Documents Download Music Pictures Public Templates Videos

/home
matthieu

/
bin   cdrom  etc   ...
boot  dev    home  ...

-
Edité par èmji 11 décembre 2015 à 11:45:57

  • Partager sur Facebook
  • Partager sur Twitter
10 décembre 2015 à 13:41:22

SOLUTIONS LEVEL2

Exercice 1 : params1.sh

#!/bin/bash
echo "J'ai été appelé avec $# arguments."

Exercice 2 : plus_grand_rep.sh

#!/bin/bash
if [ $# -ne 2 ]; then
    echo "Usage : `basename $0` dir1 dir2"
else
    size1=$(ls "$1" | wc -w)
    size2=$(ls "$2" | wc -w)
    if [ $size1 -gt $size2 ]; then
        echo "Le répertoire contenant le plus de référence est $1."
    elif [ $size2 -gt $size1 ]; then
        echo "Le répertoire contenant le plus de référence est $2."
    else
        echo "Les deux répertoires contiennent autant de références."
    fi
fi

Exercice 3 : seq1.sh

#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage : `basename $0` int"
else
    i=1
    while [ $i -le $1 ]; do
        echo $i
        let i="$i + 1"
    done
fi

Exercice 4 : home.sh

#!/bin/bash
read -t 5 -p "Chemin absolu de votre home : " home_path
if [ -z "$home_path" ]; then
    echo -e "\nTrop tard !"
else
    echo "Votre home se trouve ici : $home_path"
fi

Exercice 5 : seq2.sh

#!/bin/bash
if [ $# -eq 1 ]; then
    i=1
    while [ $i -le $1 ]; do
        echo $i
        let i="$i + 1"
    done
elif [ $# -eq 2 ]; then
    i=$1
    while [ $i -le $2 ]; do
        echo $i
        let i="$i + 1"
    done
elif [ $# -eq 3 ]; then
    i=$1
    while [ $i -le $3 ]; do
        echo $i
        let i="$i + $2"
    done
else
    echo "Usage : `basename $0` last"
    echo "Usage : `basename $0` first last"
    echo "Usage : `basename $0` first increment last"
fi

Exercice 6 : params2.sh

#!/bin/bash
echo "nom : `basename $0`"
echo "chemin : `dirname $0`"
count=1
while [ $# -gt 0 ]; do
    echo "argument $count : $1"
    let count=$count+1
    shift
done

Exercice 7 : max1.sh

#!/bin/bash
if [ $# -ne 2 ]; then
    echo "Usage : `basename $0` int1 int2"
else
    if [ $1 -gt $2 ]; then
        echo $1
    else
        echo $2
    fi
fi

Exercice 8 : max2.sh

#!/bin/bash
if [ $# -ne 3 ]; then
    echo "Usage : `basename $0` int1 int2 int3"
else
    if [ $1 -ge $2 ] && [ $1 -gt $3 ]; then
        echo $1
    elif [ $2 -gt $1 ] && [ $2 -gt $3 ]; then
        echo $2
    else [ $3 -eq $3 ]
        echo $3
    fi
fi

Exercice 9 : nombre_mystere.sh

let nb_myst="$RANDOM % 1000 + 1"
nb_try=10
while [ $nb_try -ge 1 ]
do
    read -p "Entrez un nombre entre 1 et 1000 : " try
    if [ $try -gt $nb_myst ]; then
        echo "Le nombre est plus petit."
    elif [ $try -lt $nb_myst ]; then
        echo "Le nombre est plus grand."
    else
        echo "Vous avez gagné !"
        exit 0
    fi
    let nb_try="$nb_try - 1"
    echo "Il vous reste $nb_try essais."
done
echo "Vous avez perdu ! Le nombre mystère était $nb_myst."

Exercice 10 : max3.sh

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "Usage : `basename $0` int1 ... intn"
else
    max=0
    for i in $*; do
        if [ $i -gt $max ]; then
            max=$i
        fi
    done
    echo $max
fi 

Exercice 11 : cat.sh

#!/bin/bash
if [ -z $1 ]; then    
    while read message
    do
        echo "$message"
    done
else
    while read message
    do
        echo "$message"
    done < "$1"
fi


Exercice 12 : fichiers.sh

#!/bin/bash
mkdir files
cd ./files
touch -t 01020304 file1
chmod 777 file1
echo -n xxxxxxxxxx > file2

touch file2
chmod 421 file2

echo -n xxxxxxxxxxxxxxxxxxxx > file3
touch -t 03040506 file3
chmod 4000 file3

mkdir file4
touch -t 04050607 file4
chmod 345 file4

mkfifo file5
touch -t 07080910 file5
chmod 455 file5

ln file2 file6

ln -s file1 file7

cd ..

Exercice 13 : ls_path.sh

#!/bin/bash
dir=$PWD
while [ `basename $dir` != "/" ]; do
    [ $dir != $PWD ] && echo
    dir=`dirname $dir`
    echo "$dir"
    ls "$dir"
done

-
Edité par èmji 11 décembre 2015 à 11:45:27

  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2015 à 12:04:15

LEVEL 3

Exercice 1 : last_arg.sh

Écrire un script qui affiche le dernier argument avec lequel il est invoqué.

Exemple :

./last_arg.sh un deux trois
trois

Exercice 2 : case1.sh

Usage : case1.sh int

Écrire un script qui affiche "Mauvais" si int est entre 0 et 4, "Passable" entre 5 et 9, "Bien" entre 10 et 14, "Très bien" entre 15 et 19, "Parfait" si int vaut 20, et "WTF?!" autrement.

Vous ne pouvez pas utiliser de if.

Exercice 3 : verif_path.sh

Usage : verif_path.sh path

path est un chemin absolu. Le script va vérifier un à un l'existence des dossiers et s'arrêter au premier fichier qui n'existe pas. Dans tout les cas il affiche la racine.

Exemple :

./verif_path nawak
/

Exemple 2 :

./verif_path /home/matthieu/bootcamp_bash/level3/verif_path.sh
/home/matthieu/bootcamp_bash/level3/verif_path.sh

Exemple 3 :

.verif_path /home/matthieu/bootcamp_vache/level3/verif_path.sh
/home/matthieu

Exercice 4 : backup.sh

Écrire un script qui crée une copie de chaque fichier présent dans le répertoire courant suivi du préfixe .bak. Les fichiers déjà sauvegardés seront ignorés. Le script indique le nombre de fichiers sauvegardés à la fin.

Exemple :

ls
backup.sh case1.sh case2.sh last_arg.sh the_one.sh verif_path.sh
./backup.sh
6 fichier(s) sauvegardé(s).
ls
backup.sh     case1.sh     case2.sh     last_arg.sh     the_one.sh     verif_path.sh
backup.sh.bak case1.sh.bak case2.sh.bak last_arg.sh.bak the_one.sh.bak verif_path.sh.bak
./backup.sh
0 fichier(s) sauvegardé(s).

Exercice 5 : the_one.sh

Usage : the_one.sh int

Écrire un script d'une seule ligne qui affiche autant de 1 qu'indique l'entier passer en argument. La première ligne du script, le sha-bang, ne compte pas.

Attention, il s'agit bien d'une seule ligne de commandes. Vous ne pouvez pas utilisez de point-virgule pour mettre plusieurs lignes de commandes à la suite.

Exemple :

./the_one.sh
Usage : the_one.sh int

Exemple 2 :

./the_one.sh 5
1 1 1 1 1

Exercice 6 : case2.sh

Usage : case2.sh arg

Écrire un script qui dit si la chaîne passée en argument contient des voyelles, des consonnes ou des chiffres.

Exemple :

./case2.sh yo
L'argument contient : Voyelle.

Exemple 2 :

./case2.sh yop
L'argument contient : Voyelle Consonne.

Exemple 3 :

./case2.sh 3yop
L'argument contient : Voyelle Consonne Chiffre.

Exercice 7 : tolower.sh

Écrire un script qui passe tous ses arguments en minuscule. Il n'affiche rien si il n'y a pas d'argument.

Exemple :

./tolower.sh Bonjour Les GeNS
bonjour les gens

Exercice 8 : toupper.sh

Écrire un script qui passe tous ses arguments en majuscule. Il n'affiche rien si il n'y a pas d'argument.

Exemple :

./toupper.sh Bonjour Les GeNS
BONJOUR LES GENS

-
Edité par èmji 11 décembre 2015 à 12:05:15

  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2015 à 12:24:14

SOLUTIONS LEVEL 3

Exercice 1 : last_arg.sh

#!/bin/bash
shift `expr $# - 1` 2> /dev/null
echo $1

Exercice 2 : case1.sh

[ $# -ne 1 ] && echo "Usage `basename $0` int" && exit 1
case $1 in
    [0-4]) echo Mauvais ;;
    [5-9]) echo Passable ;;
    1[0-4]) echo Bien ;;
    1[5-9]) echo Très bien ;;
    20) echo Parfait ;;
    *) echo WTF?!
esac

Exercice 3 : verif_path.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` path" && exit 1
for dir in `echo $1 | tr '/' ' '`
do
    path_test="$path/$dir"
    if [ -e "$path_test" ]; then
        path="$path_test"
    else
        break
    fi
done
if [ -z "$path" ]; then
    echo /
else
    echo $path
fi

Exercice 4 : backup.sh

#!/bin/bash
count=0
aux=${RANDOM}.tmp
ls | grep -v '\.bak' > $aux
while read -r file
do
    if [ ! -f "${file}.bak" ]; then
        cp "$file" "${file}.bak"
        let count="$count + 1"
    fi
done < $aux
rm -i $aux
rm -i ${aux}.bak
echo "$count fichier(s) sauvegardé(s)."

Exercice 5 : the_one.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1 || [ `expr $1 - 1` -ge 0 ] && echo "1 `$0 $(expr $1 - 1)`"

Exercice 6 : case2.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` arg" && exit 1
echo -n "L'argument contient :"
case $1 in
    *[aeiouy]*) echo -n " Voyelle";;&
    *[^aeiouy]*) echo -n " Consonne";;&
    *[0-9]*) echo -n " Chiffre";;&
    *) echo ".";;
esac

Exercice 7 : tolower.sh

#!/bin/bash
[ $# -eq 0 ] && exit 0
echo $@ | tr '[:upper:]' '[:lower:]'
# ou
#echo ${@,,}

Exercice 8 : toupper.sh

#!/bin/bash
[ $# -eq 0 ] && exit 0
echo $@ | tr '[:lower:]' '[:upper:]'
# ou
#echo ${@^^}
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2015 à 12:44:11

LEVEL 4

Exercice 1 : draw1.sh

Usage : draw1.sh int

Écrire un script qui dessine un carré à l'écran de la taille passé en argument.

Exemple :

./draw1.sh 1
*

Exemple 2 :

./draw1.sh 3
***
***
***

Exercice 2 : draw2.sh

Usage : draw2.sh int

Écrire un script qui dessine un triangle à l'écran de la taille passé en argument.

Exemple :

./draw2.sh 1
*

Exemple 2 :

./draw2.sh 3
*
**
***

Exercice 3 : draw3.sh

Usage : draw3.sh int

Écrire un script qui dessine un triangle inversé par rapport à l'exercice précédent, de la taille passé en argument.

Exemple :

./draw3.sh 1
*

Exemple 2 :

./draw3.sh 3
***
**
*

Exercice 4 : draw4.sh

Usage : draw4.sh int

Écrire un script qui dessine la figure donnée en exemple à l'écran de la taille passé en argument.

Exemple :

./draw4.sh 1
*

Exemple 2 :

./draw4.sh 3
  ***
 ***
***

Exercice 5 : draw5.sh

Usage : draw5.sh int

Écrire un script qui dessine une pyramide à l'écran de la taille passé en argument.

Exemple :

./draw5.sh 1
*

Exemple 2 :

./draw5.sh 3
  *
 ***
*****

Exercice 6 : draw6.sh

Usage : draw6.sh int

Écrire un script qui dessine un losange à l'écran de la taille passé en argument.

Exemple :

./draw6.sh 1
*

Exemple 2 :

./draw6.sh 3
  *
 ***
*****
 ***
  *

Exercice 7 : draw_shell.sh

Écrire un script qui affiche un prompt à l'écran. L'utilisateur rentre le nom d'une figure qui est alors dessinée à l'écran. L'utilisateur peut entre la commande 'quitter' pour quitter. Tout autre entrée provoque l'affichage du message suivant :

> qlkhsgg
Commande invalide
Les commandes valides sont : carre, triangle, triangle_inv, special, pyramide, losange et quitter

Vous ferez appel au scripts écris précédemment pour le dessin des figures.

Exemple 2 :

./draw_shell.sh 7777
> 
Commande invalide
Les commandes valides sont : carre, triangle, triangle_inv, special, pyramide, losange et quitter
> carre
Usage : draw1.sh int
> carre 3 666
***
***
***
> quitter

Exercice 8 : draw_shell2.sh

Réécrire le script précédent à l'aide d'une boucle select.

Exemple :

./draw_shell2.sh gfiuyogohuyg
1) quitter	4) triangle inverse	7) losange
2) carre	5) special
3) triangle	6) pyramide
# ? 
1) quitter	4) triangle inverse	7) losange
2) carre	5) special
3) triangle	6) pyramide
# ? 2
Taille de la figure ?  Gfiuyogohuyg
# ? 3
Taille de la figure ? 3
*
**
***
# ? 1

-
Edité par èmji 14 décembre 2015 à 13:43:00

  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2015 à 17:32:50

bonjour,

ma soif d'apprendre fait que je suis ton post ..

merci

@+

  • Partager sur Facebook
  • Partager sur Twitter
http://sinclair.recreatedzxspectrum.com/index.php
14 décembre 2015 à 13:48:14

SOLUTIONS LEVEL 4

Exercice 1 : draw1.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0; i<$1; i++)); do
    for ((j=0; j<$1; j++)); do
        echo -n '*'
    done
    echo -en '\n'
done

Exercice 2 : draw2.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0, j=1; i<$1; i++, j++)); do
    for ((k=0; k<j; k++)); do
        echo -n '*'
    done
    echo -en '\n'
done

Exercice 3 : draw3.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0, j=$1; i<$1; i++, j--)); do
    for ((k=0; k<j; k++)); do
        echo -n '*'
    done
    echo -en '\n'
done

Exercice 4 : draw4.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0, j=$1; i<$1; i++, j--)); do
    for ((k=1; k<j; k++)); do
        echo -n ' '
    done
    for ((l=0; l<$1; l++)); do
        echo -n '*'
    done
    echo -en '\n'
done

Exercice 5 : draw5.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0; i<$1; i++)); do
    for ((j=1; j<`expr $1 - $i`; j++)); do
        echo -n ' '
    done
    for ((k=0; k<`expr \( $i + 1 \) \* 2 - 1`; k++)); do
        echo  -n '*'
    done
    echo -en '\n'
done

Exercice 6 : draw6.sh

#!/bin/bash
[ $# -ne 1 ] && echo "Usage : `basename $0` int" && exit 1
for ((i=0; i<$1; i++)); do
    for ((j=1; j<`expr $1 - $i`; j++)); do
        echo -n ' '
    done
    for ((k=0; k<`expr \( $i + 1 \) \* 2 - 1`; k++)); do
        echo  -n '*'
    done
    echo -en '\n'
done
for ((i=$1; i>1; i--)); do
    for ((j=-1; j<`expr $1 - $i`; j++)); do
        echo -n ' '
    done
    for ((k=0; k<`expr \( $i - 1 \) \* 2 - 1`; k++)); do
        echo  -n '*'
    done
    echo -en '\n'
done

Exercice 7 : draw_shell.sh

#!/bin/bash
while read -p "> " cmd size non_data
do
    case $cmd in
        carre)
            ./draw1.sh $size ;;
        triangle)
            ./draw2.sh $size ;;
        triangle_inv)
            ./draw3.sh $size ;;
        special)
            ./draw4.sh $size ;;
        pyramide)
            ./draw5.sh $size ;;
        losange)
            ./draw6.sh $size ;;
        quitter)
            break ;;
        *) echo "Commande invalide"
            echo "Les commandes valides sont : carre, triangle, triangle_inv, \
special, pyramide, losange et quitter" ;;
    esac
done

Exercice 8 : draw_shell2.sh

#!/bin/bash
select cmd in quitter carre triangle "triangle inverse" special pyramide losange
do
    if [ ! -z $cmd ]; then
        case $REPLY in
            1) break ;;
        2) read -p "Taille de la figure ? " size non_data
            ./draw1.sh $size ;;
        3) read -p "Taille de la figure ? " size non_data
            ./draw2.sh $size ;;
        4) read -p "Taille de la figure ? " size non_data
            ./draw3.sh $size ;;
        5) read -p "Taille de la figure ? " size non_data
            ./draw4.sh $size ;;
        6) read -p "Taille de la figure ? " size non_data
            ./draw5.sh $size ;;
        7) read -p "Taille de la figure ? " size non_data
            ./draw6.sh $size ;;
    esac
else
    echo "Commande invalide."
fi
done
  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2015 à 10:52:21

LEVEL 5

Exercice 1 : substr.sh

Usage : substr.sh string [offset] [length]

Écrire un script qui prends une chaîne de caractère en argument et l'affiche à l'écran. Si l'offset est spécifié en deuxième argument, le script affiche la chaîne de caractère à partir de l'offset. Si la longueur est spécifiée en troisième argument, le script affiche length caractère à partir de l'offset.

Exemple :

./substr.sh
Usage : substr.sh string [offset] [length]
./substr.sh "Hello World"
Hello World
./substr.sh "Hello World" 6
World
./substr.sh "Hello World" 0 5
Hello

Exercice 2 : word.sh

Usage : word.sh file [length]

Ecrire un script qui compte le nombre de mot de longueur length dans le fichier file. Si la longueur n'est pas indiquée, le message "Default length : 4" est affiché et une longueur de 4 est utilisée.

Exemple :

cat fichier
123456 1234
123 1234
1234 1234
12 123456
./word.sh fichier
Default length : 4
4
./word.sh fichier 6
2

Exercice 3 : line.sh

Usage : line.sh file [length]

Ecrire un script qui compte le nombre de ligne de longueur length dans le fichier file. Si la longueur n'est pas indiquée, le message "Default length : 4" est affiché et une longueur de 4 est utilisée.

Exemple :

cat fichier
123456 1234
123 1234
1234 1234
12 123456
./line.sh fichier
Default length : 4
0
./line.sh fichier 9
2

Exercice 4 : icotopng.sh

Ecrire un script qui crée dans le répertoire courant 1000 fichiers ayant l'extension .ico et qui pour tous les fichiers ayant l'extension .ico du répertoire courant fait une copie du fichier avec l'extension .bak (en plus de l'extension .ico) et crée un fichier de même nom avec l'extension .png à la place de l'extension .ico.

Exemple :

ls
favicon.ico
./icotopng.sh
ls
favicon.ico.bak favicon.png aleatoire1.ico.bak aleatoire1.png aleatoire2.ico.bak aleatoire2.png ...

Exercice 5 : backup2.sh

Usage : backup2.sh backup 'pack'|'unpack' ['clean']

Ecrire un script qui, si son deuxième argument vaut 'pack' ajoute un point au nom de tous les fichiers du répertoire courant (y compris les fichiers cachés) et les ajoutes ensuite à une archive backup.tar. Si le troisième argument vaut 'clean', tous les fichiers sont effacés (sauf le script et l'archive).

Si son deuxième arguement vaut 'unpack', le script restaure tous les fichiers avec leur nom initial à partir de l'archive backup. Si le troisième argument vaut 'clean', l'archive supprime l'archive après en avoir extrait le contenu.

Exemple :

ls -a
. .. backup2.sh .file file
./backup2.sh archi pack clean
.file
file
2 fichier(s) sauvegardé(s) dans archi.tar
ls -a
. .. archi.tar backup2.sh
./backup2.sh archi unpack
tar: archi: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
unpack failed
./backup2.sh archi.tar unpack clean
.file
file
2 fichier(s) restauré(s).
Archive "archi.tar" supprimée.
ls -a
. .. backup2.sh .file file

-
Edité par èmji 19 décembre 2015 à 10:53:11

  • Partager sur Facebook
  • Partager sur Twitter
17 avril 2018 à 16:54:48

Merci énormément pour ses rappels.
  • Partager sur Facebook
  • Partager sur Twitter
17 avril 2018 à 23:13:15

Bonjour, 

Jolie initiative, merci. Je m'abonne au sujet.

-
Edité par Shiddo 17 avril 2018 à 23:13:27

  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2020 à 10:36:04

ecrire un script qui permet de calculer la somme de tous des nombre pair passés en parametre

  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2020 à 22:07:04

RAPPEL :

l'initiateur du sujet (èmji) suggère de proposer une solution à chaque exercice présenté.

j'ai écrit une quarantaine d'exercices de scripts Bash. [...] Bien sûr je donne une proposition de solution avec chaque sujet.

-
Edité par dantonq 15 juillet 2020 à 3:11:19

  • Partager sur Facebook
  • Partager sur Twitter

Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

18 novembre 2020 à 16:09:48 - Message modéré pour le motif suivant : Message complètement hors sujet


7NB

18 novembre 2020 à 18:17:53

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL