Bedingungen funktionieren nicht mit „if“, wie konvertiert man Werte in eine Ganzzahl? in Bash

Bedingungen funktionieren nicht mit „if“, wie konvertiert man Werte in eine Ganzzahl? in Bash

Mein Problem besteht darin, dass die if-Bedingungen nicht funktionieren. Ich vermute, das hängt mit dem Werttyp zusammen.

Ich weiß im Moment nicht, wie ich es lösen soll, aber mache einen Test mit:

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

Und zeigen Sie mir, dass meine „Nummer“ keine Nummer ist.

Unten ist das Skript, das dies tut, mit dem Problem, dass es immer zum ersten Mal einsteigt, selbst wenn die Bedingung falsch ist.

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

Antwort1

Ihr Test [-n $T] prüft auf eine Länge ungleich Null, nicht auf numerische Werte.

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

Es gibt einen einfacheren Test, dafür muss jedoch eine globale Shell-Option festgelegt werden, die sich auf andere Teile Ihres Skripts auswirken kann.

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

verwandte Informationen