# [BASH] Script Sencillito (Abierto)

## ZaPa

Hola.

Estoy realizando un script  muy sencillito el cual tiene que leer de un archivo (el cual contiene numeros) y si una numeración de ese archivo es menor, de un MAX que le he puesto, deberia de aumentar una variable contador....

No se que ocurre que siempre entra al if...aquí pego el script en cuestión:

```

#!/bin/bash

SITIO="8.8.8.8"

rm -r -f ping.txt

LIMITE=200;

BUCLE=0

vuelta=0

while [ $BUCLE -le 9 ]; do  #Ejecutamos 10 veces ping al host

   ping -c 1 $SITIO | awk '{ print $8 }' | grep time | tr -d '[a-z]' | tr -d '=' >> ping.txt

BUCLE=$(($BUCLE+1))

done  

for linea in `cat ping.txt`;

do

 if [ $linea > $LIMITE ];

   then 

     vuelta=$(($vuelta+1))

     echo "dentro del if"

   fi

done

echo "La variable vuelta vale: $vuelta";

```

Como podeis observar, en el if, le estoy mandando que si el contenido actual de $linea (ya qué lo controla el for) es mayor que $LIMITE (200), aumente la variable vuelta.

Lo que ocurre es que la condición no se deberia cumplir y sigue entrando al if.

Algún fallo tonto del cual no me doy cuenta.

Otra pregunta que quiero añadir más....

He visto muchisimos scripts que los autores definen los if muy similar a C, es decir:

```

 if((condicion)); 

 then

   acción a ejecutar

 fi

```

He intentado escribir un if asi (ya qué casi siempre programo en C y cuanto más se parezca mejor) y en la consola me aparece el texto "not found"....¿Alguna idea al respecto?

Saludos.

----------

## i92guboj

Antes de nada una nota estilística: cuando cada instrucción va en una línea, el punto y coma final es superfluo. En otras palabras, yo haría ésto:

```
if <foo>; then
```

O bien:

```
if <foo>

then
```

Pero no:

```
if <foo>;

then
```

Lo mismo para for/do. Tampoco necesitas el punto y coma al final de la declaración de una variable, a no ser que pienses hacer más cosas en la misma línea. En cualquier caso, como ya dije arriba, es una cuestión de estilo, más que un verdadero problema. 

```
rm -r -f ping.txt 
```

Comprueba antes si existe:

```
test -r foo.txt && rm -f foo.txt
```

```
 if [ $linea > $LIMITE ]; 
```

En el while de antes tienes una comparación bien hecha, sigue tu propio ejemplo y arregla esta de forma similar. '>' no es un operador de comparación en bash, excepto si aparece entre ((..)). Usualmente '>' es un operador de redirección. Tal y como lo usas en tu script debería crearse un archivo basura que tendrá como nombre el contenido de $LIMITE.

```

   then 

     vuelta=$(($vuelta+1)) 

     echo "dentro del if" 

   fi 

done 
```

Muchas veces te puedes ahorrar este tipo de trucos si usar '#!/bin/bash -x' en la primera línea de tu script. Es una especie de modo verboso de depuración de bash.

----------

## i92guboj

Si quieres una sintaxis similar a C usa tcsh o alguna otra variante de csh en lugar de bash. Aunque, personalmente (y aún considerando a C uno de los mejores lenguajes existentes y siendo quizás con el que más experiencia tengo) no creo que la sintaxis de C sea una ventaja en un languaje de shell.

----------

## ZaPa

Hola i92jubog y muchisimas gracias por tus aclaraciones ya he hecho las modificaciones pertinentes. Pero ahora me he topado con otro problema...el archivo de texto que deseo analizar contiene numeros con decimales, es decir, no int, si no, tipo float. Y creo que es por eso me suelta este error:

```

[: 25: Illegal number: 36.5

[: 25: Illegal number: 36.7

[: 25: Illegal number: 36.5

[: 25: Illegal number: 35.8

[: 25: Illegal number: 36.3

[: 25: Illegal number: 36.5

[: 25: Illegal number: 45.7

[: 25: Illegal number: 36.7

[: 25: Illegal number: 36.7

[: 25: Illegal number: 35.8

```

El código que se encarga de leer y comparar es este:

```

for linea in `cat ping.txt`

do

 if [ $linea -le $LIMITE ]

   then 

    vuelta=$(($vuelta+1))

    echo "dentro del if"

  fi

done
```

 ¿Debo utilizar algun otro comando para la comparación de un numero entero hacia otro decimal?

Un saludo.

----------

## i92guboj

 *ZaPa wrote:*   

> Hola i92jubog y muchisimas gracias por tus aclaraciones ya he hecho las modificaciones pertinentes. Pero ahora me he topado con otro problema...el archivo de texto que deseo analizar contiene numeros con decimales, es decir, no int, si no, tipo float. Y creo que es por eso me suelta este error:
> 
> ```
> 
> [: 25: Illegal number: 36.5
> ...

 

Las capacidades aritméticas de bash se limitan a números enteros (int, como tú dices, en la jerga C). Cualquier otro tipo de dato numérico no puede ser manejado por bash de forma directa. No estoy al tanto de las capacidades de otros shells, posiblemente ksh o csh puedan manejar tales tipos de dato (o no, no lo se). En cualquier caso, y en aras de una mejor portabilidad, lo que yo recomendaría es el uso de alguna utilidad externa, como por ejemplo "bc", que es el estándard para cálculos de todo tipo en el mundo *nix.

----------

