# Whiptail + contrôle de saisie

**URL:** <https://www.debian-fr.org/t/whiptail-controle-de-saisie/66389>\
**Category:** Trucs et Astuces\
**Created:** [Février 21, 2016, 9:46 UTC](https://www.debian-fr.org/t/whiptail-controle-de-saisie/66389 "2016-02-21T21:46:30Z")\
**Posts on this page:** 1\
**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, 9:46 UTC](https://www.debian-fr.org/t/whiptail-controle-de-saisie/66389/1 "2016-02-21T21:46:31Z")

</div>

Bonjour,

Voici un petit script test pour implémenter un contrôle de saisie avec une REGEX sous bash. J’arrive à y ajouter un retour en arrière mais pas plus d’une fois et sans contrôle de saisie…  
Enfin j’ai quand même essayé !

[code]#!/bin/bash

# -_- coding: UTF8 -_-

# 

function testip () {  
IP=$(whiptail --inputbox “Tapez l’adresse IPV4 que vous souhaitez assigner au serveur   
(au format [xxx.xxx.xxx.xxx](http://xxx.xxx.xxx.xxx) ou x représente un chiffre) :” 20 80 $(ifconfig| grep “inet adr”| grep -v 127.0.0.1|awk ‘{print $2}’|cut -d: -f2) 3\>&1 1\>&2 2\>&3)  
}  
testip  
if [$? = 1]  
then  
whiptail --msgbox “Retour au menu.” 20 80  
else  
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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testip  
done  
fi

function testmask () {  
netmask=$(whiptail --inputbox “Tapez l’adresse du masque de sous reseau :” 20 80 $(ifconfig |grep Masque|grep Bcast|awk ‘{ print $4 }’|cut -d: -f2) 3\>&1 1\>&2 2\>&3)  
}  
testmask  
if [$? = 1]  
then  
testip  
testmask  
else  
until [[“$netmask” =~ ^((255|[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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testmask  
done   
fi

function testdns () {  
dns=$(whiptail --inputbox “Tapez l’adresse du serveur DNS primaire :” 20 80 $(grep nameserver /etc/resolv.conf|head -n 1|awk ‘{ print $2 }’ ) 3\>&1 1\>&2 2\>&3)  
}  
testdns  
if [$? = 1]  
then  
testmask  
testdns  
else  
until [[“$dns” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testdns  
done   
fi

function testdns2 () {  
dns2=$(whiptail --inputbox “Tapez l’adresse du serveur DNS secondaire :” 20 80 $(grep nameserver /etc/resolv.conf|head -2|tail -1|awk ‘{ print $2 }’ ) 3\>&1 1\>&2 2\>&3)  
}  
testdns2  
if [$? = 1]  
then  
testdns  
testdns2  
else  
until [[“$dns2” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testdns2  
done   
fi

function testgate () {  
gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” 20 80 $(route|grep default|awk ‘{print $2}’) 3\>&1 1\>&2 2\>&3)  
}  
testgate  
if [$? = 1]  
then  
testdns2  
testgate  
else  
until [[“$gateway” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testgate  
done   
fi

function domaine\_addr () {  
domain=$(whiptail --inputbox “Tapez votre nom de domaine :” 20 80 $(grep domain /etc/resolv.conf|awk ‘{print $2}’) 3\>&1 1\>&2 2\>&3)  
}  
domaine\_addr  
if [$? = 1]  
then  
testgate  
domaine\_addr  
else  
until [[“$domain” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]  
do  
whiptail --msgbox "Retentez votre saisie… " 20 80  
domaine\_addr  
done  
fi

function hostname\_addr () {  
hostname=$(whiptail --inputbox “Tapez le nom de machine de votre serveur” 20 80 $(cat /etc/hostname) 3\>&1 1\>&2 2\>&3)  
}  
hostname\_addr  
if [$? = 1]  
then  
domaine\_addr  
hostname\_addr  
else  
until [[“$hostname” =~ ^(([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])$ ]]  
do  
whiptail --msgbox "Retentez votre saisie… " 20 80  
hostname\_addr  
done  
fi[/code]

Le code n’est probablement pas très propre mais je suis sûr que vous aurez des idées 😃  
Si on enlève le retour en arrière (–nocancel) ça fonctionne plutôt bien :

[code]#!/bin/bash

# -_- coding: UTF8 -_-

# 

function testip () {  
IP=$(whiptail --inputbox “Tapez l’adresse IPV4 que vous souhaitez assigner au serveur   
(au format [xxx.xxx.xxx.xxx](http://xxx.xxx.xxx.xxx) ou x représente un chiffre) :” --nocancel 20 80 $(ifconfig| grep “inet adr”| grep -v 127.0.0.1|awk ‘{print $2}’|cut -d: -f2) 3\>&1 1\>&2 2\>&3)  
}  
testip  
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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testip  
done

function testmask () {  
netmask=$(whiptail --inputbox “Tapez l’adresse du masque de sous reseau :” --nocancel 20 80 $(ifconfig |grep Masque|grep Bcast|awk ‘{ print $4 }’|cut -d: -f2) 3\>&1 1\>&2 2\>&3)  
}  
testmask  
until [[“$netmask” =~ ^((255|[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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testmask  
done

function testdns () {  
dns=$(whiptail --inputbox “Tapez l’adresse du serveur DNS primaire :” --nocancel 20 80 $(grep nameserver /etc/resolv.conf|head -n 1|awk ‘{ print $2 }’ ) 3\>&1 1\>&2 2\>&3)  
}  
testdns  
until [[“$dns” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testdns  
done

function testdns2 () {  
dns2=$(whiptail --inputbox “Tapez l’adresse du serveur DNS secondaire :” --nocancel 20 80 $(grep nameserver /etc/resolv.conf|head -2|tail -1|awk ‘{ print $2 }’ ) 3\>&1 1\>&2 2\>&3)  
}  
testdns2  
until [[“$dns2” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testdns2  
done

function testgate () {  
gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” --nocancel 20 80 $(route|grep default|awk ‘{print $2}’) 3\>&1 1\>&2 2\>&3)  
}  
testgate  
until [[“$gateway” =~ ^(([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  
whiptail --msgbox "Retentez votre saisie… " 20 80  
testgate  
done

function domaine\_addr () {  
domain=$(whiptail --inputbox “Tapez votre nom de domaine :” --nocancel 20 80 $(grep domain /etc/resolv.conf|awk ‘{print $2}’) 3\>&1 1\>&2 2\>&3)  
}  
domaine\_addr  
until [[“$domain” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]  
do  
whiptail --msgbox "Retentez votre saisie… " 20 80  
domaine\_addr  
done

function hostname\_addr () {  
hostname=$(whiptail --inputbox “Tapez le nom de machine de votre serveur” --nocancel 20 80 $(cat /etc/hostname) 3\>&1 1\>&2 2\>&3)  
}  
hostname\_addr  
until [[“$hostname” =~ ^(([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])$ ]]  
do  
whiptail --msgbox "Retentez votre saisie… " 20 80  
hostname\_addr  
done[/code]

Voilà !
