Linux/Unix Shell Scripting - Problema con variables shellscript pasar a numero

 
Vista:

Problema con variables shellscript pasar a numero

Publicado por Jose (1 intervención) el 29/08/2006 13:33:18
buenas, pues tengo un problema con un shellscript que estoy haciendo, y el problema es el siguiente:

tengo un archivo llamado arxiufinal.out que contiene lineas las cuales son de este formato:

192.3.4.6 22.5.6.3 1500 294893
132.4.6.7 3.5.6.7 5 20000
133.4.5.6 2.5.6.7 2 333
133.4.5.6 2.5.6.7 2 333
133.4.5.6 2.5.6.7 2 333
1.2.3.4 5.7.8.9 4 63

y bueno lo que tiene que hacer el script desarrollado es comparar la linea actual con la linea anterior, comparar los 2 primeros campos y, en caso de ser iguales, sumar el 3r campo actual con el 3r campo anterior, y sumar el 4rto campo actual con el 4rto anterior y pasarlos a otro archivo. Vaya que lo que tiene que hacer es eliminar repetidos.


todo va bien excepto la suma, que me dice que no es variable numerica o error de sintaxis, y ya no se que hacer, no se si hay alguna manera de que me transforme una variable a numerica, el script en cuestion es este:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
if [ -e total.out ]
then
echo borrant total.out
rm total.out
fi
llargaria=$(wc -l arxiufinal.out | awk '{print $1}')
l=1
dns1anterior=$(head -1 arxiufinal.out | tail -1| awk '{print $1}')
dns2anterior=$(head -1 arxiufinal.out | tail -1| awk '{print $2}')
packetsanterior=$(head -1 arxiufinal.out | tail -1| awk '{print $3}')
bytesanterior=$(head -1 arxiufinal.out | tail -1| awk '{print $4}')
bytesactual=0
packetsactual=0
 
echo $dns1anterior $dns2anterior $packetsanterior $bytesanterior >>total.out
 
for (( l = 2; l <= $llargaria; l++ ))
        do
        dns1actual=$(head -$l arxiufinal.out | tail -1| awk '{print $1}')
        dns2actual=$(head -$l arxiufinal.out | tail -1| awk '{print $2}')
        packetsactual=$(head -$l arxiufinal.out | tail -1| awk '{print $3}')
        bytesactual=$(head -$l arxiufinal.out | tail -1| awk '{print $4}')
 
              if [ "$(echo $dns1actual)" = "$(echo $dns1anterior)" ] && [ "$(echo $dns2actual)" = "$(echo $dns2anterior)" ]
              then
              echo SI
 
              sed -ne ':a' -e '$q;N;2,${P;D;}' -e 'ba' total.out > total2.out
              rm total.out
              cp total2.out total.out
              rm total2.out
 
 
packetsanterior= $( expr $packetsactual + $packetsanterior )<------AQUI ESTA EL PROBLEMA
bytesanterior= $( expr $bytesactual + $bytesanterior )<--- AQUI ESTA EL PROBLEMA TAMBIEN
 
        echo "$dns1actual $dns2actual $packetsanterior $bytesanterior" >> total.out
 
              else
              echo NO
              echo "$dns1actual $dns2actual $packetsactual $bytesactual" >>total.out
 
 
            fi
 
              dns1anterior=$dns1actual
              dns2anterior=$dns2actual
done


he probado con variables auxiliares, y varias cosas mas pero sigue sin ir, alguien sabe como arreglarlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con variables shellscript pasar a nume

Publicado por Ion (3 intervenciones) el 31/08/2006 11:26:14
No he analizado mucho el script, pero si el fallo es realmente donde tú dices, el problema puede que sea que alguna de las variables que sumas, no sea realmente un valor numérico...es una idea...

Puedes comprobar si una variable es numérica (valor entero) con algo parecido a esto:

1
2
3
4
5
#Quita los caracteres que no sean digitos
nodigitos="$(echo $VARIABLE | sed s/[0-9]//g)"
if [ -n "$nodigitos" ]; then
        echo "NO ES UN VALOR NUMERICO"
fi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con variables shellscript pasar a nume

Publicado por lonn (1 intervención) el 10/06/2009 10:15:40
sed, es con t, set!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE.Problema con variables shellscript pasar a nume

Publicado por Ruth (1 intervención) el 09/07/2009 09:13:58
Este es el programa que estoy haciendo .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
REGIS=`asterisk -rx "sip show peers" |grep -v "sip peers" |grep -v "(Unspecified)" |grep -v "Unmonitored" |grep -v "Name/username" | wc -l`
WARN=$1
CRIT=$2
echo $REGIS
if [$REGIS -le $WARN];then
        echo WARNING  $REGIS sip registrados
        exit 1
elif [$REGIS -ge $CRIT];then
        echo CRITICAL  $REGIS sip registrados
        exit 2
else
        echo $REGIS
        exit 0
      fi
   fi
exit

Yo creo que el problema reside en que la Variable REGIS recibe el texto '47' y lo que necesito es un número no un texto, no encuentro la solucion de como pasar de un texto a un número.

Muchas gracias por adelantado.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE.Problema con variables shellscript pasar a nume

Publicado por lamberto (2 intervenciones) el 18/10/2016 14:32:19
yo tengo el mismo problema no encuentro enlinux, ni ubuntu una forma de convertir una variable cadena a una variable numérica que luego pueda usar como limite de un bucle for

alguien noe puede ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 104
Oro
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

RE.Problema con variables shellscript pasar a nume

Publicado por xve (309 intervenciones) el 18/10/2016 18:08:12
La manera de convertir una cadena e entero es:

1
2
3
a="25"
echo $((a))
echo $((a+3))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar