Bash: ganzzahliger Ausdruck erwartet, mit Lesen/Test

Bash: ganzzahliger Ausdruck erwartet, mit Lesen/Test

Ich lerne die Grundlagen der Shell-Programmierung, also habe ich etwas Einfaches geschrieben wie

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi

Nach meinem Verständnis sind Variablen in Bash untypisiert und jede Variable kann als Ganzzahl verwendet werden, wenn sie nur Ziffern enthält. Aber ich erhalte die Fehlermeldung „Ganzzahliger Ausdruck erwartet“, wenn ich dies ausführe … warum?

Antwort1

declareTatsächlich können Sie mithilfe der (oder der alten typeset) integrierten Funktion einige Attribute für Variablen festlegen . declare -i var1 var2legt für diese Variablen ganzzahlige Attribute fest. Danach führen Zuweisungen, die versuchen, diesen Variablen nicht ganzzahlige Werte zuzuweisen, zu einem Fehler.

Ihr Problem betrifft jedoch die Syntax. Wenn Sie den Wert einer Variablen verwenden, müssen Sie ihrem Namen Folgendes voranstellen $:

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Ausnahmen sind die arithmetischen Auswertungen, bei denen Folgendes nicht erforderlich ist $:

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Als Warnung: Setzen Sie Ihre Variablen innerhalb von [.. ]immer in doppelte Anführungszeichen, um zu vermeiden, dass die Worterweiterung die Syntax Ihres Ausdrucks durcheinander bringt. (Ich meine, Sie werden Probleme mit nicht gesetzten Variablen, Variablen, die leere Zeichenfolgen enthalten, und Variablen, die IFSZeichen enthalten, haben.) Oder Sie können stattdessen das neuere und bessere [[.. verwenden ]], das solche Fälle korrekt behandelt:

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi

Antwort2

Sie sollten Variablen referenzieren, indem Sie dem Namen Folgendes voranstellen:$

if [ $var1 -lt $var2 ] ; then...

verwandte Informationen