Salut à tous,
Dans un script Bash, connaissez-vous une méthode pour tester si le paramètre $1 (ou autre variable) est de type numérique (entier) ?
Salut à tous,
Dans un script Bash, connaissez-vous une méthode pour tester si le paramètre $1 (ou autre variable) est de type numérique (entier) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if [ $(echo $i | grep -v [a-Z] | wc -l) -gt 1 ]; then ........ ; fi
Merci pour l'idée, juste une petite adaptation (le résultat est soit "0", soit "1", jamais supérieur à "1") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #............................................................................... # Tester un nombre entier positif ou nul et sortir (exit) s'il ne l'est pas. # Parametre 1 : valeur a tester # Parametre 2 : message d'erreur a afficher (facultatif) # Exit : 1, la valeur est incorrecte #............................................................................... TestEntierPositifNulExit() { if [ $(echo $1 | grep -v [a-Z] | wc -l) -eq 0 ]; then if [ "($2)" = "()" ]; then echo "Erreur : valeur $1 non entiere positive ou nulle !" else echo $2 fi exit 1 fi }
Envoyé par COGAN
Syntaxe valable en ksh et en bash
Pour le bash, l'option extglob doit être active :
shopt -s extglob
http://marcg.developpez.com/ksh/#L4.2 ( 4.3. Les expressions )
Gestion des entiers non signés :
if [[ $var = +([0-9]) ]] ; then
echo "* numerique"
else
echo "*** non numerique"
fi
Gestion des entiers signés :
if [[ $var = ?([-+])+([0-9]) ]] ; then
echo "* numerique"
else
echo "*** non numerique"
fi
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
Autre solution :
petite explication :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 $var=$1 [ $var -eq 0 ] 2>/dev/null if [ $? -eq 0 -o $? -eq 1 ] then echo "c'est un entier" else echo "c'est pas un entier" fi
On utilise le code de retour de la première comparaison, O = vrai et 1 = faux, un autre code, c'est que le test s'est planté, donc que la variable n'est pas un entier.
++
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Merci à tous !
Ce post m'a sensibilisé encore davantage à l'utilisation des scripts !
bonjour,
j'ai créé deux méthodes. (BASH >= 4.4environ)
un méthode variable__is_int qui vérifie si la variable est de type entier ce qui je pense répond à la question.
ensuite une deuxième méthode value__is_int qui vérifie si la valeur est la valeur d'un entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 variable__is_int () { local -i return_code=1 if [[ ${#@} -eq 1 && -n "${1}" ]]; then local -n _value=${1} if [[ -R _value && "$(declare -p ${1})" =~ 'declare -i' ]]; then return_code=0 fi fi return ${return_code} } 2>>/dev/nullcela utilise un printf '%d' pour vérifier si une valeur est bien en entier (ici un entier signé)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 value__is_int () { local -i return_code=1 if [[ ${#@} -eq 1 && -n "${1}" ]]; then printf '%d' "${1}" if [[ ${?} -ne 0 ]]; then local -n _value=${1} if [[ -R _value ]]; then if [[ -v _value ]]; then printf '%d' "${_value}" if [[ ${?} -eq 0 ]]; then return_code=0 fi elif [[ "$(declare -p ${1})" =~ 'declare -i' ]]; then return_code=0 fi fi else return_code=0 fi fi return ${return_code} } &> /dev/null
pour vérifier le type, cela tente de faire une référence de nom du paramètre (vérifier que c'est bien une variable et non une valeur) ensuite cela compare declare -p de la variable avec celle d'un entier declare -i.
Le plus compliqué, c'est de faire quelque chose de simple.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager