ti-enxame.com

Bash: Testando se uma variável é um inteiro

Eu gostaria de testar se minha variável $var é na verdade um inteiro ou não. Como posso fazer isso?

18
Jary

Contanto que você esteja usando a versão bash> = 3, você pode usar uma expressão regular:

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

Enquanto this bash FAQ menciona inconsistências na implementação do regex bash em várias bash 3.x ( a regex deve ser citada ou não ), acho que neste caso, há Não há personagens que precisem de citação em qualquer versão, por isso estamos seguros. Pelo menos funciona para mim em:

  • 3,00.15 (1) -release (x86_64-redhat-linux-gnu)
  • 3.2.48 (1) -release (x86_64-Apple-darwin12)
  • 4.2.25 (1) -release (x86_64-pc-linux-gnu)
 $ a = "" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = "" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = "a" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ A = 'olá mundo!' 
 $ [[$ A = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = 'olá mundo 42!' 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = "42" 
 $ [[$ A = ~ ^ -? [0-9] + $]] && echo integer 
 Integer 
 $ A = "42.1" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 $ a = "- 42" 
 $ [[$ a = ~ ^ -? [0-9] + $]] && echo integer 
 Integer 
 $ A = "dois" 
 $ [[$ A = ~ ^ -? [0-9 ] + $]] && echo integer 
13
Digital Trauma
function is_int() { return $(test "[email protected]" -eq "[email protected]" > /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

Eu estava precisando de algo que retornaria true apenas para inteiros positivos (e falha para a string vazia). Eu me decidi sobre isso:

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

o 2>/dev/null existe porque o teste imprime um erro (e retorna 2) se uma entrada (para -ge) não for analisada como um inteiro

Eu gostaria que pudesse ser mais curto, mas "teste" não parece ter uma opção "silenciosa" e trata "" como um inteiro válido (zero).

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

Você consegue fazer isso:

shopt -s extglob

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

O ## greedily remove a expressão regular do valor retornado por "varname", portanto, se o var é um inteiro, é verdadeiro, false, se não.

Ele tem a mesma fraqueza que a resposta principal (usando "$ foo! = [! 0-9] "), que se $ varname estiver vazio, retornará true. Eu não sei se isso é válido. Se não apenas mudar o teste para:

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

echo your_variable_here | grep "^-\?[0-9]*$" retornará a variável se for um inteiro e não retornará nada de outra forma.

1
Fraxtil

Você pode executar uma operação * 2/2 que verifica ambos se o valor é numérico e é inteiro. A operação retorna 0 se não numérico

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