2012-01-16 13 views
5

yo hicimos un shell script que encuentra el tamaño de un directorio, devolviéndolo en formato legible por humanos (por ejemplo, 802M o 702K). Quiero calcular la diferencia entre los tamaños.cadenas Restar (que son números) en un script de shell

Aquí está mi script de shell hasta ahora:

#!/bin/bash 

current_remote_dir_size=789M 
new_remote_dir_size=802M 
new_size=`echo ${new_remote_dir_size} | grep -o [0-9]*` 
current_size=`echo ${current_remote_dir_size} | grep -o [0-9]*` 

echo "${new_size}-${current_size}" 

Pero la salida del script es sólo

- 

¿Cómo puedo hacer el trabajo resta?

Respuesta

11

Puede hacer matemáticas básicas enteras en bash envolviendo la expresión en $(( y )).

$ echo $((5 + 8)) 
13 

En su caso concreto, las siguientes obras para mí:

$ echo "${new_size}-${current_size}" 
802-789 
$ echo $((${new_size}-${current_size})) 
13 

Su salida al final es un poco extraño. Compruebe que la expresión grep realmente produce la salida deseada. Si no es así, es posible que deba envolver la expresión regular entre comillas.

+0

Hmm, sigo recibiendo un error. Cambié la última línea a 'echo $ (($ {new_size} - $ {current_size}))', pero luego aparece un error de operando. –

+0

@mr_schlomo Funciona en mi sistema. Ver mi publicación editada. Asegúrate de que el 'grep' realmente funcione como lo esperas. –

+0

¡Ooops! Sí, 'grep' era el problema. ¡Solo ejecuté mi script en mi servidor Linux y funcionó! –

1

No es necesario llamar a grep para despojar a las letras de sus cadenas:

current_remote_dir_size=789M 
current_size=${current_remote_dir_size%[A-Z]} 
echo $current_size # ==> 789 

new_remote_dir_size=802M 
new_size=${new_remote_dir_size%[A-Z]} 
echo $new_size  # ==> 802 

Ver Shell Parameter Expansion en el manual de bash.

+0

Pero esto silenciosamente restaría 802k-789M. :) –

1

Todo lo que necesita es:

echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/})) 
  • $ ((a + b - 4)) se puede utilizar para expresiones aritméticas
  • $ {string/M /} reemplaza M en cadena con nada . Consulte man bash, sección Cadena de sustitución, para obtener más posibilidades y detalles.
+0

Me sale un error de sustitución con esto. –

+0

¿Cómo lo invocas? –

Cuestiones relacionadas