Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/01/2014, à 23:45

Pam547

Bash conditions alpha-numérique et caractères spéciaux

Re ..

#! /bin/bash
while [[ $arg < 0 || $arg > 31 ]]
do
echo -n "Quel est le $i er jour de permanence du mois " # choix du jour
read arg
echo $arg
done

Le comportement est satisfaisant pour les valeurs de 1 à 99. (De 1 à 31 la boucle s’arrête de 32 à 99 la boucle continue)
Mais les valeurs 100 à 310 réagissent bizarrement (La boucle s’arrête  ... hmm)
Puis comportement normale pour les valeurs supérieur à 320. (La boucle continue )

Je ne comprends pas pourquoi ...


Merci

Dernière modification par Pam547 (Le 03/01/2014, à 19:38)


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#2 Le 02/01/2014, à 23:50

Watael

Re : Bash conditions alpha-numérique et caractères spéciaux

salut,

entre [ et ] ou [[ et ]], > et < ne sont pas des opérateurs arithmétiques.
regarde

help test

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 02/01/2014, à 23:53

Braun

Re : Bash conditions alpha-numérique et caractères spéciaux

Bonsoir,
Quoi c'est "arg"?
Pour moi ce serait bien une chaîne de caractères.

Hors ligne

#4 Le 02/01/2014, à 23:56

Pam547

Re : Bash conditions alpha-numérique et caractères spéciaux

@Watael
Je vais lire ...
Mais "-lt" et "-gt" ne fonctionnent pas non plus

@Braun
Dans le script c'est censé être une année donc un entier


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#5 Le 03/01/2014, à 00:19

Braun

Re : Bash conditions alpha-numérique et caractères spéciaux

Censé, censé c'est vite dit, si tu tiens compte de la remarque de Watael, avec "-lt" et "-gt" arg sera effectivement considéré comme un entier.
Bien sûr pour éviter les bavures il vaut mieux (enfin c'est souvent recommandé) initialiser les critères de boucle avant de tourner:

#! /bin/bash
arg=-1
while [[ $arg -lt 0 || $arg -gt 31 ]]
do
echo -n "Quel est le $i er jour de permanence du mois " # choix du jour
read arg
echo $arg
done

Hors ligne

#6 Le 03/01/2014, à 00:28

Pam547

Re : Bash conditions alpha-numérique et caractères spéciaux

Génial
Merci Braun


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#7 Le 03/01/2014, à 19:37

Pam547

Re : Bash conditions alpha-numérique et caractères spéciaux

En fait j'ai répondu à Braun que arg était un entier.

En réalité c'est le contenu d'un tableau ...

#! /bin/bash
list1=$(seq 8)
for i in $list1
do
ddate[$i]=-1
while [[ ${ddate[$i]} -lt 0 || ${ddate[$i]} -gt 31  ]]
do
echo -n "Quel est le $i er jour de permanence du mois " # choix du jour
read ddate[$i]
if [[ ${ddate[$i]} -lt 0 || ${ddate[$i]} -gt 31 ]]
then
echo -e "\n\nIl faut un nombre entre 1 et 31 "
fi
done
done

Quand est saisi un nombre le comportement est acceptable ...
Par contre si je rentre un caractère alphabétique la boucle continue au lieu de se relancer.
Et si je rentre un caractère spéciale c'est la panique mais il continue quand même avec le message (ligne 8: & : erreur de syntaxe : opérande attendue (le symbole erroné est "&") )


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#8 Le 03/01/2014, à 20:02

Braun

Re : Bash conditions alpha-numérique et caractères spéciaux

Bonjour,
Ne pas confondre "contenu d'un tableau" et "élément d'un tableau" le premier est rarement un entier alors que le second est assez souvent un entier.
Sur le fond, tous les ordinateurs du monde se disent entre eux "errare humanum est", il faut donc faire avec et reformer ton programme avec une fonction de test plus élaborée:
Lire une chaîne de caractères au clavier puis
- soit la calibrer en filtrant tous les caractères non numériques (i.e. prendre l'opérateur pour un imbécile mais faire avec), et tester la valeur numérique obtenue.
- soit filtrer la chaîne pour n'accepter que des valeurs numériques de deux chiffres au plus comprises entre 1 et 31. Ce que tu avais tenté au tout début en omettant la clef "moins de deux chiffres".

Hors ligne

#9 Le 03/01/2014, à 22:19

Pam547

Re : Bash conditions alpha-numérique et caractères spéciaux

Pas simple ces expressions rationnelles et régulières ...

Avec ta seconde proposition :

Cette ligne, dans les deux conditions, résout le problème (ou presque) pour les caractères alphabétiques  :

[[ ${ddate[$i]} -lt 0 || ${ddate[$i]} -gt 31 || ! ${ddate[$i]} =~ ^[0-9]*$ ]]

Le problème persiste encore avec les caractères spéciaux et les caractères commençant par un chiffre puis une lettre ...
Affolement ... mais continuité acceptable du script.


Ta première proposition (si j'ai bien compris) serait de chercher dans le codage ascii de chaque caractère mais là ...
Au vu des difficultés de bash à manipuler les tableaux c'est écarté.

Merci pour ton attention


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne