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
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.
++
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.
Partager