es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema al comparar cadenas en BASH

Necesito hacer un script de bash para comparar el espacio de un vg en servidores Redhat.
Lo que tengo hasta ahora es:


VARS CMD=$(vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}') SPACE="10.00" if [[ "$CMD" < "$SPACE" ]]; then echo "No hay suficiente espacio, debes extender el VG" echo "El espacio es igual a: $CMD GB" elif [[ "$CMD" == "$SPACE" ]]; then echo "Hay suficiente espacio, pero considera extender el VG" elif [[ "$CMD" > "$SPACE" ]]; then echo "Hay suficiente espacio" echo "El espacio es igual a: $CMD GB" fi

Lo que hago con este comando es obtener la salida de los grupos de volúmenes y analizar los datos para obtener el valor deseado vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}' y guardarlo en la variable CMD.
Donde la salida del comando vgs es:

[root@servidor ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  vgSoft   2  13   0 wz--n-  71.99g <26.14g
  vgSys    1  12   0 wz--n- <63.51g <36.52g

Entonces, en este caso, el resultado de mi variable CMD es 26.14
Y estoy haciendo la comparación con el valor 10.00 (que se asigna a la variable SPACE).

Pero tengo un problema al comparar las cadenas, porque si la salida del comando vgs es, por ejemplo, 9.46, el script me dice que "Hay suficiente espacio" cuando la salida debería ser "No hay suficiente espacio, debes extender el VG".
Hasta donde recuerdo, no puedo usar los operadores "eq", "gt" o "ne" porque estoy comparando cadenas y no valores enteros.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para realizar una comparación válida entre el espacio de un vg en servidores Redhat, puedes usar el comando bc para realizar aritmética de punto flotante y luego comparar el resultado con la variable SPACE. Aquí está el script actualizado:

    #!/bin/bash
    
    ##VARS
    CMD=$(vgs | grep vgSoft | awk '{split($6, arr, /g/); print arr[1]}')
    SPACE="10.00"
    
    if (( $(echo "$CMD < $SPACE" | bc -l) )); then
        echo "No hay suficiente espacio, debes ampliar el VG"
        echo "El espacio es igual a: $CMD GB"
    elif (( $(echo "$CMD == $SPACE" | bc -l) )); then
        echo "Hay suficiente espacio pero considera ampliar el VG"
    else
        echo "Hay suficiente espacio"
        echo "El espacio es igual a: $CMD GB"
    fi
    

    En este script actualizado, estamos utilizando el comando awk para extraer el tamaño del grupo de volúmenes vgSoft, y luego usando la función split para eliminar el sufijo g y almacenar el valor en el array arr. A continuación, estamos comparando el valor CMD con el valor SPACE usando el comando bc para realizar aritmética de punto flotante. El comando bc devuelve 1 para verdadero y 0 para falso, que luego podemos usar en las declaraciones if para hacer la comparación.

Comments are closed.