Los condicionales no funcionan con if, ¿cómo convertir valores a números enteros? en fiesta

Los condicionales no funcionan con if, ¿cómo convertir valores a números enteros? en fiesta

El problema que tuve es que los condicionales if no funcionan, supongo que está relacionado con el tipo de valor.

De momento no supe como solucionarlo, pero haz una prueba con:

var=T
if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
    echo number
else
    echo not a number
fi

Y muéstrame que mi "número" no es un número.

A continuación se muestra el script que lo hace con el problema de ingresar siempre al primero incluso si la condición es incorrecta.

SENT="/home/trader/monitor2/ArchivosPruebas/CambiosLiquidacion5deUWT/Enviados.log";
RECEIVED="/home/trader/monitor2/ArchivosPruebas/CambiosLiquidacion5deUWT/Recibidos.log";   
RESULT="/home/trader/CCVPending/Liquidaciones/Liquidaciones.log"

T0=$(cat $SENT | grep 63=1 | wc -l);T1=$(cat $SENT | grep 63=2 | wc -l);T2=$(cat $SENT | grep 63=3 | wc -l);T3=$(cat $SENT | grep 63=4 | wc -l);
T4=$(cat $SENT | grep 63=5 | wc -l);T5=$(cat $SENT | grep 63=9 | wc -l);TOTAL=$(($T0+$T1+$T2+$T3+$T4+$T5));

for i in 0 1 2 3 4 5; do
echo "------ T+$i -----" >> $RESULT
ii=$((1+$i)); if [ $i = 5 ]; then ii=9; fi; 
T=$(($((T$i)))); echo T $T con i en 63=$ii

if [ $T -le 10 ] || [ $T -gt 0 ] ; then
        echo if; cat $SENT | grep 63=$ii | grep 487=0 | sed "s/.*31=/Qty=/"|sed "s/.32=/,Price=/"|sed "s/.48=.*.55=/,Emisora=/"|sed "s/.60=.*.63=$ii/,T+0/"|sed "s/.487=.*.54=/,Side=/"|sed "s/.453=.*.448=/,Firm=/"   | sed "s/.447=.*//" | grep -x "Qty=.*.,Price=.*.,Firm=[A-Z][A-Z]*.">> $RESULT
elif [ $T -le 30 ] || [ $T -gt 10 ] ; then echo elif
        echo elif; cat $SENT | grep 63=$ii | grep 487=0 | sed "s/.*48=.*.55=/Emisora=/"|sed "s/.60=.*.448=/,Firm=/"| sed "s/.447=.*//" | grep -E "Emisora=[A-Z].*.,Firm=[A-Z][A-Z].*." >> $RESULT
else echo else;
echo $T >> $RESULT
fi
done

Respuesta1

Su prueba [ -n $T ] está probando una longitud distinta de cero, no numérica.

Paul--) T=7x7
Paul--) case "$T" in (+([[:digit:]])) echo "Y";; (*) echo "N";; esac
N
Paul--) T=787
Paul--) case "$T" in (+([[:digit:]])) echo "Y";; (*) echo "N";; esac
Y

Existe una prueba más simple, pero requiere configurar una opción de shell global que puede afectar otras partes de su script.

Paul--) shopt -s extglob
Paul--) T=787
Paul--) [[ "$T" = +([0-9]) ]] && echo "Y" || echo "N"
Y
Paul--) T=7x7
Paul--) [[ "$T" = +([0-9]) ]] && echo "Y" || echo "N"
N

información relacionada