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?
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:
$ 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
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
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).
shopt -s extglob
case "$var" in
+([0-9]) ) echo "integer";
esac
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]}" ]
echo your_variable_here | grep "^-\?[0-9]*$"
retournera la variable s'il s'agit d'un entier et ne retournera rien sinon.
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