command condition às vezes inteiro às vezes string

1

Eu quero executar essa condição

while [ $(cat /path_of a file/) -eq 1 ]

A condição só está correta se

$(cat /path_of a file/) 

é um inteiro e não uma string!

Como posso superar esse problema?

    
por user64519 06.04.2014 / 16:05

2 respostas

2

Você pode fazer isso com o operador = , como [ $(cat /path_of a file/) = 1 ] . Ele compara as representações de string de ambos os argumentos para que funcione em todos os casos.

Usar -eq em vez de comparação de string pode ser preferível em alguns casos ( [ 01 -eq 1 ] é true enquanto [ "01" = 1 ] não é) mas na maioria dos casos é apenas mais perigoso. Se, por outro lado, você realmente precisar de comparação de números inteiros, você deve usar a sugestão @Gnouc.

    
por 06.04.2014 / 16:20
1

Variável no bash é sem tipagem. Se você quiser que a condição seja sempre avaliada com números inteiros, você pode usar delcare -i para tornar variável sempre um inteiro. De bash manpage :

declare [-aAfFgilrtux] [-p] [name[=value] ...]
.....
-i     The variable is treated as an integer; arithmetic evaluation
       (see ARITHMETIC EVALUATION above) is performed  when the variable
       is assigned a value.

Assim, seu exemplo se torna:

declare -i number
number="$(cat /path_of a file/)"

while [ "$number" -eq 1 ]

Uma observação de que, se você tiver bash versão 4.x, deverá usar o novo teste [[...]] em vez de [...] .

    
por 06.04.2014 / 16:18