# Script bash à tester

**URL:** <https://www.debian-fr.org/t/script-bash-a-tester/57330>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:40 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330 "2016-02-21T14:40:34Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:40 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/1 "2016-02-21T14:40:34Z")

</div>

Bonsoir,

Je vous livre ici un petit script maison qui fournit un assistant d’installation/config pour plusieurs services :

- config IP
- DNS (local) : Bind9
- DHCP isc-dhcp-server
- CLOUD : Owncloud 5 + LAMP + https
- SMTP : Postfix + LAMP ou LDAP + roudcube en https
- IPTABLES (config de base)
- Proxy avec Squid 3/Dansquardian/sarg
- Coloration syntaxique shell de root + vim
- Kvm/Virt-manager/Lxde + outils graphiques style gnome-manager iceweasel…
- Certif autosigné avec CA

C’est le deuxième post concernant mon script mais je ne fais que suivre les conseils avisés de ricardo (modo) !  
Le programme, côté utilisateurs, est présenté sous forme d’assistant. Il modifie les fichiers de conf des différents services proposés.  
Mon script est destiné à Debian SQUEEZE/WHEEZY et se lance avec bash.

Sur une machine neuve ( de préférence) et avec les droits du super utilisateur :

`wget http://pbb.trio.free.fr/tsgeri/SuperServeur.bsh
bash SuperServeur.bsh`

Bonne soirée !

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/2 "2016-02-21T14:41:12Z")

</div>

Tu pourrais pas faire en sorte de remplacer MySQL par MariaDB ? Disons que c’est plus en adéquation avec le contrat social Debian ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/3 "2016-02-21T14:41:12Z")

</div>

Je vais faire mon chieur moi aussi : Squeeze ça fait tellement 2011, quid de Wheezy ? 😉

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/4 "2016-02-21T14:41:12Z")

</div>

Il y en a des choses à dire dans les 2600 lignes. C’est beaucoup trop pour un seul fichier. C’est impossible à maintenir.

Tu devrait déclarer tes fonctions dans un fichier séparé, créer un script par sous-assistant et garder le fichier principal pour charger les autres fichiers et gérer la navigation entre les sous parties.  
Pareil les fichiers de configuration devraient être séparé c’est plus simple de s’y retrouver (et tu bénéficie de la coloration syntaxique quand tu les édite).

Quand je vois ligne 1005 (mais tu l’a fais plusieurs fois), ça :

[code]function exit\_all () {  
echo "  
##########################################################################  
Vous souhaitez :  
1 - Quitter l’installation  
2 - Retourner au menu principal  
##########################################################################"  
read Quit\_install  
case $Quit\_install in 1) exit;;  
2) clear screen ; Assistant\_Debian;;  
esac

while [“$Quit\_install” != “1”] && [“$Quit\_install” != “2”]  
do  
echo "Merci de taper 1 ou 2"  
exit\_all  
done  
}

exit\_all[/code]  
J’ai beaucoup de choses à dire :  
[ul]  
[li]il y a un problème d’indentation : très peut de choses sont indentées dans ton code et ça nuit gravement à la lisibilité (là en l’occurrence il y a une vraie erreur au niveau du case). D’autre part je crois que plus personne n’indente avec des tabulation, c’est très compliqué d’indenter avec des tabulation parce qu’il ne faut pas utiliser que des tabulations. Une tabulation ça n’a pas de taille fixe, en général par défaut c’est 8 colonnes, mais tu peut mettre la valeur que tu veux et bien indenter avec des tabulations ça consiste à rendre le code toujours aussi agréable à lire quelque soit la taille de la tabulation.[/li]  
[li]tu utilise une fonction récursive ! Mon dieux c’est vraiment choquant ! Surtout qu’elle sert à rien.[/li]  
[li]tu crée une fonction pour l’appeler tout de suite et plus jamais ensuite ça n’a pas d’intérêt[/li][/ul]

Voici comment je l’écrirais moi.

`while true; do
    cat <<EOF
##########################################################################
Vous souhaitez :
	1 - Quitter l'installation
	2 - Retourner au menu principal
##########################################################################
EOF
    read Quit_install
    case "${Quit_install}" in
        1)
            exit;;
        2)
            clear screen
            Assistant_Debian
        ;;
        *)
            echo 'Merci de taper 1 ou 2'
        ;;
    esac
done`

Il n’y a plus de fonction, plus de récurssion, tout est indenté. On comprend bien qu’on a l’affichage d’une menu, la lecture d’une entrée utilisateur et qu’on s’attend à avoir 1 ou 2 sinon petit message et on boucle.

Tu a tendance à écrire des fonctions dans des fonctions, c’est mal aussi.

Tu as beaucoup de code qui se répète, genre ça :

`echo "
##############################################################################
$name nous allons, à présent, procéder au paramétrage de Bind9
##############################################################################"
sleep 1`

Tu pourrais plutôt faire ça :

[code]function title () {  
cat \<\<EOF  
##############################################################################  
$1  
##############################################################################  
EOF  
[[-z “$2”]] || sleep “$2”  
}

title “$name nous allons, à présent, procéder au paramétrage de Bind9” 1[/code]

Et ta fonction title tu l’utilise partout après.

Après il y a pleins de petites choses :  
[ul][li]tes variables sont rarement protégées[/li]  
[li]ça sed -i “s/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/$serial/” pourrait être avantageusement remplacé par sed -ir “s/[0-9]{10}/$serial/”[/li]  
[li]je vois que dans la partie dns tu fais des sauvegardes de fichiers puis tu les restaure si besoin, c’est bien mais faut pas que tu oublie la partie restauration quand tu ajoute un fichier à sauvegarder. pour éviter ce risque tu met la liste des fichiers dans un tableau et tu itère sur ce tableau pour sauvegarder comme pour restaurer[/li]  
[li]l’utilisation des tes par [[]] plutôt que [][/li][/ul]

Ça fait déjà assez de boulot je trouve.

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/5 "2016-02-21T14:41:12Z")

</div>

> [@syam](#):
>
> Je vais faire mon chieur moi aussi : Squeeze ça fait tellement 2011, quid de Wheezy ? 😉

Bonjour Syam,

Personnellement, je ne met en prod que des distro «&nbsp;stables&nbsp;» mais penses tu que j’aurais beaucoup de choses à modifier si tu a eu l’occasion de tester wheezy ?

Cordialement,

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/6 "2016-02-21T14:41:12Z")

</div>

> [@Mimoza](#):
>
> Tu pourrais pas faire en sorte de remplacer MySQL par MariaDB ? Disons que c’est plus en adéquation avec le contrat social Debian ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

Bonjour Mimoza,

Je n’ai pas encore eu le temps de tester mariadb non plus, à vrai dire je n’en eu vent qu’il y a 2 semaines… Les commendes sont-elles exactement les mêmes du genre :

```auto
mariadb -u root -p < fichier_cmd
```

ou

```auto
mariadbadmin -u root --pasword=xxxxxxxxxxxx < fichier_cmd
```

Je vais y jeter un coup d’œil !

Cordialement,

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/7 "2016-02-21T14:41:13Z")

</div>

Bonjour Mimoza,

Merci beaucoup pour ce post très détaillé, lorsque tu dis :

sed -ir “s/[0-9]{10}/$serial/”

Tu m’aides beaucoup car j’ai essayé d’implémenter ce regex mais sans succès je pense qu’il me manquait tout simplmement le r en argument pour sed !  
Merci aussi pour les autres remarques, comme tu l’as dit ça va me faire du taf pour nettoyer tout ça !  
En ce qui concerne les fichiers séparés, je préfère garder autant que faire se peut tout dans un seul fichier, pour l’édition, j’utilise notepad ++ (sous winbug) et je bosse dans des fichiers séparé avant de les réinjecter dans le fichier principal donc pas de soucis de coloration syntaxique. Autant je suis un fervent partisant de vim pour l’édition des fichiers, autant pour 2600 lignes je ne peux pas…  
Pour les case avec un : \*) la boucle est-elle infinie tant que l’utilisateur n’a pas donné une réponse correcte ? Lorsque tu dis : “tes variables sont rarement protégées” je ne comprends pas, je suis autodidacte et je galère un peu !

J’ai du taf !!!

Merci encore.

---

<div class="post-metadata">

**Author:** ![Chr0my](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/a87d85/32.png) [@Chr0my](https://www.debian-fr.org/u/Chr0my)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/8 "2016-02-21T14:41:13Z")

</div>

Le fait d’utiliser plusieurs fichiers n’est pas simplement pour la coloration syntaxique, c’est plus pour un soucis de “maintenabilité”. Trouver des portions de codes dans un fichier qui fait des milliers de ligne n’est pas à mon avis la chose la plus aisée à faire (pour toi comme pour ceux qui lisent ton code!).  
De plus, en optimisant l’utilisation de tes fonctions comme le soulignait MisterFreeze, tu économiserais déjà un paquet de lignes.

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/9 "2016-02-21T14:41:13Z")

</div>

Oui MariaDB est 100% compatible avec les commandes MySQL, c’est une volonté du créateur de MariaDB qui est le même que MySQL.  
[aldarone.fr/passer-de-mysql-a-mariadb/](http://aldarone.fr/passer-de-mysql-a-mariadb/)

Avec un peu plus de détail :  
[kb.askmonty.org/en/mariadb-vers … atibility/](https://kb.askmonty.org/en/mariadb-versus-mysql-compatibility/)

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/10 "2016-02-21T14:41:14Z")

</div>

> [@vincentsan](#):
>
> sed -ir «&nbsp;s/[0-9]{10}/$serial/&nbsp;»

Erreur de ma part c’est -ri et pas -ir

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:42 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/11 "2016-02-21T14:42:31Z")

</div>

Bonjour,

J’ai commencé à revoir mon script, j’ai essayé mariadb avec le cloud et ça fonctionne correctement j’ai testé la fonction de MisterFreez (title) et c’est le top, mais pour la gestion des erreurs j’essaye de trouver comment utiliser les regex mais sans succès. Voici un script de test qui ne fonctionne pas :

`echo "type an iP"
read test
if ["${test}" = [0-9]{1-3}+\.[0-9]{1-3}+\.[0-9]{1-3}+\.[0-9]{1-3} ]
then
echo "bravo"
echo "$test"
else
echo "try again, I meant IPV4 !"
echo "test iP"
read test
echo $test
fi`

Si quelqu’un a une idée, je suis preneur.

A + et merci pour tout les gars !

---

<div class="post-metadata">

**Author:** ![lol](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lol/32/15629_2.png) [@lol](https://www.debian-fr.org/u/lol)\
**Post date:** [Février 21, 2016, 2:42 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/12 "2016-02-21T14:42:32Z")

</div>

Salut,  
J’ai trouvé un bout de script ici: [linuxjournal.com/content/val … ash-script](http://www.linuxjournal.com/content/validating-ip-address-bash-script)

[code]#!/bin/bash  
function valid\_ip()  
{  
local ip=$1  
local stat=1

```
if [[$ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi
return $stat

```

}

i=0  
while ((i \<= 0))  
do  
echo "Votre IP ?"  
read test  
valid\_ip $test  
if [[$? -eq 0]]; then echo OK; ((i=1)); else echo Recommencez; fi  
done[/code]

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:42 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/13 "2016-02-21T14:42:33Z")

</div>

Merci lol,  
Je viens de trouver le même script et je suis en train de l’implémenter à l’install de squid !  
Je dis bravo à l’auteur qui nous a pondu une fonction simple mais très efficace voici un exemple d’intégration qui fonctionne avec un bout de script :

[code]function valid\_ip()  
{  
local ip=$1  
local stat=1

```
if [[$ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/24$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi
return $stat

```

}

echo "  
#########################################################################  
Tapez ici le réseau que vous souhaitez autoriser dans Squid avec le  
préfixe du réseau au format [xxx.xxx.xxx.xxx/xx](http://xxx.xxx.xxx.xxx/xx) :  
#########################################################################"  
read Acl\_Network  
valid\_ip $Acl\_Network  
if [[$? -eq 0]]; then echo good; else echo “Tapé avec les pieds ?” ; sleep 2 ; clear screen ; echo -n “Nouvel essai :” ; read Acl\_Network ; fi  
sed -i “s|acl localnet src 192.168.0.0/16|acl localnet src $Acl\_Network|” /etc/squid/squid.conf  
clear screen [/code]

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:42 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/14 "2016-02-21T14:42:49Z")

</div>

Bonjour,

J’ai trouvé un moyen d’implémenter la gestion des erreurs avec une boucle ! Car la solution ci dessus ne permet pas cela (en tout cas je n’ai pas trouvé le moyen de mettre une boucle while avec un regex).  
Je suis conscient que ma méthode n’est pas très élégante mais elle fonctionne. Si jamais quelqu’un a une idée d’amélioration du code je suis preneur.

[code]

## anticon @IP

function testip () {  
echo "tapez une adresse IP :"  
read IP  
}  
testip  
function check\_ip () {  
if [[“$IP” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] ; then echo “Vous avez saisi une @IP plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testip ; check\_ip $IP ; fi  
}  
check\_ip $IP

function testip\_netw () {  
echo "tapez l’adresse de votre réseau :"  
read Netw  
}

## anticon @IP network

testip\_netw  
function check\_ip () {  
if [[“$Netw” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(/[1-2]{1}[0-9]{1})|(/3[0-2]{1})|(/[0-9])$ ]] ; then echo “Vous avez saisi une @IP réseau plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testip\_netw ; check\_ip $Netw ; fi  
}  
check\_ip $Netw

## anticon @mail

function mail\_addr () {  
echo "tapez l’adresse mail :"  
read Email  
}  
mail\_addr  
function check\_mail () {  
if [[“$Email” =~ ^[A-Za-z0-9.\_%±]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]] ; then echo “Bravo vous avez tapé une adresse email avec succès !” ; else clear screen ; echo "Retentez votre saisie : " ; mail\_addr ; check\_mail ; fi  
}  
check\_mail $Email[/code]

Si ça peut aider certains…

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:42 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/15 "2016-02-21T14:42:49Z")

</div>

Comme ça par exemple ?

[code]#!/bin/bash

#positionne la variable globale IP  
function get\_ip () {  
read -p 'tapez une adresse IP : ’ IP  
until [[“$IP” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] ; do  
clear screen ;  
echo 'Retentez votre saisie : '  
read -p 'tapez une adresse IP : ’ IP  
done  
echo ‘Vous avez saisi une @IP plausible !’  
}  
get\_ip

echo “IP : $?”[/code]

---

<div class="post-metadata">

**Author:** ![vincentsan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b38774/32.png) [@vincentsan](https://www.debian-fr.org/u/vincentsan)\
**Post date:** [Février 21, 2016, 2:43 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/16 "2016-02-21T14:43:25Z")

</div>

Merci beaucoup Mr Freeze !

A mon grand désespoir, je n’avais pas encore vu ton message et je viens d’implémenter la gestion des erreurs sur l’ensemble de mon script…

Voici néanmoins le fruit de mon travail :

[code]## anticon IP  
function valid\_ip()  
{  
local ip=$1  
local stat=1

```
if [[$ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi
return $stat

```

}  
read LaVariable  
valid\_ip $LaVariable  
if [[$? -eq 0]]; then echo good; else “Tapé avec les pieds ?” ; sleep 2 ; clear screen ; echo -n “Dernière chance :” ; read LaVariable ; fi

## anticon network

function valid\_netw() {  
local ip=$1  
local stat=1

```
if [[$ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi
return $stat

```

}  
read LaVariable  
valid\_netw $LaVariable  
if [[$? -eq 0]]; then echo good; else “Tapé avec les pieds ?” ; sleep 2 ; clear screen ; echo -n “Dernière chance :” ; read LaVariable ; fi

## anticon @IP

function testip () {  
echo "tapez l’adresse IP :"  
read IP  
}  
testip  
function check\_ip () {  
if [[“$IP” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] ; then echo “Vous avez saisi une @IP plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testip ; check\_ip $IP ; fi  
}  
check\_ip $IP

## anticon @IP network

function testip\_netw () {  
echo "tapez l’adresse de votre réseau :"  
read Netw  
}

testip\_netw  
function check\_ip () {  
if [[“$Netw” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])((/[1-2]{1}[0-9]{1})|(/3[0-2]{1})|(/[0-9])){1,2}$ ]] ; then echo “Vous avez saisi une @IP réseau plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testip\_netw ; check\_ip $Netw ; fi  
}  
check\_ip $Netw

## anticon Numéro de Port

function testNum () {  
echo "  
#########################################################################  
Tapez ici le numéro du port que vous souhaitez ouvrir :  
#########################################################################"  
read Num  
}  
testNum  
function check\_Num () {  
if [[“$Num” =~ ^([0-9]){1,4}$ ]] || [[“$Num” =~ ^[1,2,3,4,5][0-9]{1,4}$ ]] || [[“$Num” =~ ^6([0-9]){4}$ ]] ; then echo “Vous avez saisi numéro de port plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testNum ; check\_Num $Num ; fi  
}  
check\_Num $Num

## anticon @mail

function mail\_addr () {  
echo "tapez l’adresse mail :"  
read Email  
}  
mail\_addr  
function check\_mail () {  
if [[“$Email” =~ ^[A-Za-z0-9.\_%±]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]] ; then echo “Bravo vous avez tapé une adresse email avec succès !” ; else clear screen ; echo "Retentez votre saisie : " ; mail\_addr ; check\_mail $Email ; fi  
}  
check\_mail $Email

## anticon serial bind

function serial\_saisie () {  
echo "  
###########################################################################  
Tapez ici le numéro de série au format : AAAAMMJJSS où SS est le sérial.  
###########################################################################"  
read serial  
}  
serial\_saisie  
function check\_serial () {  
if [[“$serial” =~ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$ ]] ; then echo “Bravo vous avez tapé un numéro de série correctement interprétable par Bind9 !” ; else clear screen ; echo "Retentez votre saisie : " ; serial\_saisie ; check\_serial $serial; fi  
}  
check\_serial $serial

## anticon @prefixe

function testprefixe () {  
echo "  
tapez ici le préfixe qui définit le masque de votre sous  
réseau (exemple : /24)"  
read prefixe  
}  
testprefixe  
function check\_prefixe () {  
if [[“$prefixe” =~ ((/[1-2]{1}[0-9]{1})|(/3[0-2]{1})|(/[0-9]))$ ]] && [[“$prefixe” != [???]$ ]] ; then echo “Vous avez saisi un prefixe plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testprefixe ; check\_prefixe $prefixe ; fi  
}  
check\_prefixe $prefixe

## anticon domaine

function domaine\_addr () {  
echo "tapez votre nom de domaine :"  
read mondomaine  
}  
domaine\_addr  
function check\_domaine () {  
if [[“$mondomaine” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]] ; then echo “Bravo vous avez tapé un nom de domaine avec succès !” ; else clear screen ; echo "Retentez votre saisie : " ; domaine\_addr ; check\_domaine $mondomaine ; fi  
}  
check\_domaine $mondomaine

## anticon octet

function testoct4 () {  
echo "Tapez ici le 2ème octet de l’@IPV4 du serveur :"  
read oct4  
}  
testoct4  
function check\_oct4 () {  
if [[“$oct4” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$ ]] ; then echo “Vous avez saisi un octet plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testoct4 ; check\_oct4 $oct4 ; fi  
}  
check\_oct4 $oct4

## anticon myhostname

function myhostname\_addr () {  
echo "Tapez ici le nom de machine de votre serveur"  
read myhostname  
}  
myhostname\_addr  
function check\_myhostname () {  
if [[“$myhostname” =~ ^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]_[a-zA-Z0-9]).)_([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]\*[A-Za-z0-9])$ ]] ; then echo “Bravo vous avez tapé un nom de machine avec succès !” ; else clear screen ; echo "Retentez votre saisie : " ; myhostname\_addr ; check\_myhostname $myhostname ; fi  
}  
check\_myhostname $myhostname

## anticon FQDN

function CLOUD\_FQDN\_addr () {  
echo "  
$name tapez le nom FQDN de la machine qui héberge le serveur de cloud :"  
read CLOUD\_FQDN  
}  
CLOUD\_FQDN\_addr  
function check\_CLOUD\_FQDN () {  
if [[“$CLOUD\_FQDN” =~ ^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]_[a-zA-Z0-9]).)_([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]\*[A-Za-z0-9])+[A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]] ; then echo “Bravo vous avez tapé un nom de machine avec succès !” ; else clear screen ; echo "Retentez votre saisie : " ; CLOUD\_FQDN\_addr ; check\_CLOUD\_FQDN $CLOUD\_FQDN ; fi  
}  
check\_CLOUD\_FQDN $CLOUD\_FQDN

## anticon domaine LDIF

function domaine\_addr () {  
echo "Tapez le nom votre domaine au format LDIF (ex : dc=google,dc=com): "  
read Domaine\_LDIF  
}  
domaine\_addr  
function check\_domaine () {  
if [[“$Domaine\_LDIF” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]] || [[“$Domaine\_LDIF” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]] || [[“$Domaine\_LDIF” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]] ; then echo “Bravo vous avez tapé un nom de domaine au format LDIF !” ; else clear screen ; echo "Retentez votre saisie : " ; domaine\_addr ; check\_domaine $Domaine\_LDIF ; fi  
}  
check\_domaine $Domaine\_LDIF

## anticon sous-domaine

function check\_sous\_domaine () {  
echo -n "Tapez ici le premier sous domaine de l’organisation (ex pour le domaine [grp5.info-msj.net](http://grp5.info-msj.net) taper : grp5) : "  
read sous\_domaine  
}  
check\_sous\_domaine  
function check\_domaine () {  
if [[“$sous\_domaine” =~ [A-Za-z0-9.-]$ ]] ; then echo “Bravo vous avez tapé un nom de sous domaine correct !” ; else clear screen ; echo "Retentez votre saisie : " ; check\_sous\_domaine ; check\_domaine $sous\_domaine ; fi  
}  
check\_domaine $sous\_domaine

## anticon mailsize

function testmailsize () {  
echo "  
###########################################################################  
Tapez la taille max des fichiers joints uploades sur le serveur en Mo  
(saisissez une valeure comprise entre 01 et 15. La réponse doit  
impérativement comprendre 2 caractères) :  
###########################################################################"  
read mailsize  
}  
testmailsize  
function check\_mailsize () {  
if [[“$mailsize” =~ 1[0-5]$ ]] || [[“$mailsize” =~ 0[0-9]$ ]] ; then echo “Vous avez saisi une taille max des fichiers joints plausible !” ; else clear screen ; echo "Retentez votre saisie : " ; testmailsize ; check\_mailsize $mailsize ; fi  
}  
check\_mailsize $mailsize

## anticon passwd

function pass\_confirm () {  
echo "  
###########################################################################  
Tapez le mot de passe de l’utilisateur $contact :  
###########################################################################"  
read pass\_user

echo "  
###########################################################################  
Confirmez le mot de passe de l’utilisateur $contact :  
###########################################################################"  
read pass\_user2  
}  
pass\_confirm  
while [“${pass\_user}” != “${pass\_user2}”]  
do  
echo “Les mots de passe ne correspondent pas !” ; sleep 2 ; clear screen  
pass\_confirm  
done[/code]

Les regex proposés ici sont pour la plupart issus du web mais certains sont de ma composition, je vous demande donc d’être indulgent avec moi, c’est ma première approche…  
Je re-publierais une version de mon script une fois que je l’aurais suffisamment débugué (pas tant pour la pureté du code mais plus pour avoir un retour sur l’ergonomie du programme) !

A + et MERCI A TOUS 🙂

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:43 UTC](https://www.debian-fr.org/t/script-bash-a-tester/57330/17 "2016-02-21T14:43:26Z")

</div>

Avant de me coucher :

`function testNum () {
echo "
#########################################################################
Tapez ici le numéro du port que vous souhaitez ouvrir :
#########################################################################"
read Num
}
testNum
function check_Num () {
if [["$Num" =~ ^([0-9]){1,4}$ ]] || [["$Num" =~ ^[1,2,3,4,5][0-9]{1,4}$ ]] || [["$Num" =~ ^6([0-9]){4}$ ]] ; then echo "Vous avez saisi numéro de port plausible !" ; else clear screen ; echo "Retentez votre saisie : " ; testNum ; check_Num $Num ; fi
}
check_Num $Num`  
Tu test un num (en fait non c’est un port, mais bon). Utilise les techniques pour tester les nombres :

[code]#!/bin/bash

function testNum () {  
read -p "Tapez ici le numéro du port que vous souhaitez ouvrir : "  
until [[“${REPLY}” =~ ^[[:digit:]]+$ && “${REPLY}” -gt 0 && “${REPLY}” -lt 65536 ]] ; do  
#clear screen  
echo "Retentez votre saisie : "  
read -p "Tapez ici le numéro du port que vous souhaitez ouvrir : "  
done  
echo “Vous avez saisi numéro de port plausible !“  
PORT=”$REPLY”  
}

testNum

echo “port : $PORT”[/code]  
C’est :  
[ul]  
[li]indenté[/li]  
[li]plus simple[/li]  
[li]plus lisible[/li]  
[li]avec une seule méthode simple et pas des récursions toute pourries[/li][/ul]

Par contre de manière générale, ça sert à rien de créer une fonction pour l’appeler toute de suite après. Crée toutes tes fonctions au début du fichiers et utilise les ensuite (si tu ne veux pas les garder dans un fichier séparer). Ça rend l’algo principale plus lisible.
