Boucle pour vérifier un caractère

Fermé
Bojamin - 5 mai 2020 à 09:48
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 - 7 mai 2020 à 11:54
Bonjour,

Je cherche à réaliser une vérification de certaines de mes variables quand on rentre dans mon programme

ch1=$1
ch2=$2
ch3=$3
ch4=$4
code=$ch1$ch2$ch3$ch4
letter=('A' 'B' 'C' 'D' 'E' 'F' 'G' 'H')

while [[ "$ch1" != "${letter}" ]]
do
read -p 'Il faut un code valide : ' ch1 ch2 ch3 ch4
done


Il faudrait que chacun de mes paramètres correspondent soit a A ou B ou C ou D ou E ou F ou G ou H.

Je pensais faire une vérification avec un tableau mais celui ci ne prends que la première valeur du tableau :/

Configuration: Windows / Firefox 75.0
A voir également:

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 420
Modifié le 5 mai 2020 à 10:44
Salut,

Une idée parmi d'autres…

$ cat bar.sh 
#! /bin/bash
#set -xv

A=( A B C D E F G H )

for i in "${@}"
do
case "${i}" in
A|B|C|D|E|F|G|H) echo "Paramètre ${i} correct."
   ;;
*)   echo "Paramètre ${i} incorrect."
   ;;
esac
done



$ ./bar.sh A B J N O E X C
Paramètre A correct.
Paramètre B correct.
Paramètre J incorrect.
Paramètre N incorrect.
Paramètre O incorrect.
Paramètre E correct.
Paramètre X incorrect.
Paramètre C correct.


;-)

0
Salut,
du coup pour le début j'ai trouvé et je vais utiliser une regex [A-H].
Néanmoins j'aimerais bien savoir si il une solution avec un seul paramètre.

Si par exemple je fais : ABCD il faut que cela soit vrai
Néanmoins si je fait ABCZ il faut que cela soit faux.

Une idée ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 420 > Bojamin
5 mai 2020 à 14:27
À part éclater ton paramètre afin de checker chaque caractère un par un, je ne vois pas ;-\
0
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 > Bojamin
7 mai 2020 à 11:26
comme ça ?
re='^[A-H]{4}$'
$ [[ ABCD =~ $re ]]; echo $?
0
$ [[ ABCZ =~ $re ]]; echo $?
1
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 420 > Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020
7 mai 2020 à 11:37
Salut,

Je pense que c'est plus complexe que ça ;-(

ABCD était un exemple, mais je pense qu'on pourrait avoir ADEH ou BCAG, ou encore CAHFD, etc. comme argument avec les bons caractères, d'où la nécessité de tester chaque caractère et d'éclater l'ensemble ;-\

À moins que tu nous dégotes une regex d'excellence digne de ce nom ;-)
0
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
Modifié le 7 mai 2020 à 11:54
les lettres qui composent le mot doivent être dans un intervalle donné : entre A et H, par exemple.
si le seul souci est le nombre de caractères "limitant" :
$ mot=ABCD
$ re="^[A-H]{${#mot}}\$"
$ [[ $mot =~ $re ]]; echo $?
il n'est pas dit qu'il faut indiquer quel caractère est erroné. Là, simplement, on dit que le mot est valide, ou pas.
sinon, en effet, il faut "éclater" le mot.
0