web-dev-qa-db-fra.com

Bash: Test si une variable est un entier

Je voudrais tester si ma variable $var est en réalité un entier ou non. Comment puis-je s'il vous plaît faire ça?

18
Jary

Tant que vous utilisez bash version> = 3, vous pouvez utiliser une expression régulière:

[[ $a =~ ^-?[0-9]+$ ]] && echo integer

Bien que this bash FAQ mentionne des incohérences dans l’implémentation de regex bash dans divers bash 3.x (si la regex doit être citée ou non), je pense que dans ce cas, aucun caractère besoin de citer dans n'importe quelle version, donc nous sommes en sécurité. Au moins ça marche pour moi dans:

  • Version 3.00.15 (1) (x86_64-redhat-linux-gnu)
  • Version 3.2.48 (1) (x86_64-Apple-darwin12)
  • 4.2.25 (1) -release (x86_64-pc-linux-gnu)
 $ a = "" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo entier 
 $ a = "" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo entier 
 $ A = "a" 
 $ [[$ A = ~ ^ -? [0-9] + $]] && echo entier 
 $ a = 'hello world!' 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo entier 
 $ a = 'hello world 42!' 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo entier 
 $ a = "42" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 integer 
 $ a = "42.1" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = "- 42" 
 $ [[$ A = ~ ^ -? [0-9] + $]] && echo entier 
 Entier 
 $ A = "deux" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo entier 
13
Digital Trauma
function is_int() { return $(test "$@" -eq "$@" > /dev/null 2>&1); }

input=0.3
input="a b c"
input=" 3 "
if $(is_int "${input}");
   then
   echo "Integer: $[${input}]"
else
   echo "Not an integer: ${input}"
fi
4
yabt

J'avais besoin de quelque chose qui ne retournerait vrai que pour les entiers positifs (et échouera pour la chaîne vide). Je me suis installé sur ceci:

test -n "$1" -a "$1" -ge 0 2>/dev/null

le 2>/dev/null est présent parce que test affiche une erreur (et renvoie 2) si une entrée (à -ge) ne s'analyse pas en tant qu'entier

Je souhaite que cela puisse être plus court, mais "test" ne semble pas avoir une option "silencieuse" et considère "" comme un entier valide (zéro).

2
JasonWoof
shopt -s extglob
case "$var" in
 +([0-9]) ) echo "integer";
esac
1
ghostdog74

Tu peux le faire:

shopt -s extglob

if [ -z "${varname##+([0-9])}" ]
then
  echo "${varname} is an integer"
else
  echo "${varname} is not an integer"
fi

## avidement supprime l'expression régulière de la valeur renvoyée par "nomvar", donc si la variable var est un entier, elle vaut true, sinon false.

Il a la même faiblesse que la réponse la plus haute (avec "$ foo! = [! 0-9] "), si $ varname est vide, il retourne true. Je ne sais pas si c'est valide. Sinon changez simplement le test en:

if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ]
1
Svend Hansen

echo your_variable_here | grep "^-\?[0-9]*$" retournera la variable s'il s'agit d'un entier et ne retournera rien sinon.

1
Fraxtil

Vous pouvez effectuer une opération * 2/2 qui vérifie les deux si la valeur est numérique et un entier . L'opération renvoie 0 si elle n'est pas numérique

echo "Try with 10"

var=10
var1=`echo $((($var*2)/2))`

if [ "$var" == "$var1" ]; then
  echo '$var integer'
else
  echo '$var not integer'
fi

echo "Try with string"

var=string
var1=`echo $((($var*2)/2))`

if [ "$var" == "$var1" ]; then
  echo '$var integer'
else
  echo '$var not integer'
fi
0
Nick El Cadmio